Soul.art 发表于 2009-1-9 15:19:53

高速电机恒速问题(4000-40000/分钟)可调,用PWM无法控制,有图【恢复】

在刚接这个项目时,客户说最高只有4000转速,按以下图纸设计的方案来做,没有问题,但是后来客户拿来的样品却是8:1降速输出,电机每分钟最高40000转,现在这个方案根本无法控制,PWM频率1KHZ,占空比1%,电机就直上8000转,根本无法下调,请做过的朋友支个招~~先谢了,在线等~~

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_579724.JPG
 (原文件名:电机调速器.JPG) 

rowdy 发表于 2009-1-9 23:22:09

降低电机磁极数

supersai 发表于 2009-1-9 20:41:34

貌似交流电机?没有过零检测?1K PWM?楼主用错方法了!

hexenzhou 发表于 2009-1-9 19:17:46

交流电机?可控硅控制?

gliet_su 发表于 2009-1-9 19:08:17

仿真未必是真。

avr-qq 发表于 2009-1-9 18:10:30

U3 是可控硅吧? 它不应该用 pwm@1k 来控制的

本贴被 avr-qq 编辑过,最后修改时间:2009-01-09,18:11:11.

Soul.art 发表于 2009-1-9 15:42:56

这么快就沉了,顶一下

笑谈 发表于 2013-4-15 21:53:32

Soul.art 发表于 2009-1-9 15:42 static/image/common/back.gif
这么快就沉了,顶一下

楼主搞好了没?我现在也在做同样功能的电路,用槽型光电开关侦测速度的。程序也同样有问题,出来讨论下

Soul.art 发表于 2013-4-17 12:24:36

本帖最后由 Soul.art 于 2013-4-17 12:27 编辑

这个早已经解决了,当时是速度采集的抗干扰电容取值过大,转速太高,霍尔信号被滤平了,所以PID整定得到的转速是0,电机就直冲云霄了,呵呵

scybzxl 发表于 2013-4-17 14:35:10

不能确定你图中电路是否可靠,图中采用双向可控硅降压控制,这样电机扭矩能满足吗?如果图中双向可控硅控制方案可行,你换个0-5V输出的DA输出芯片不就解决了吗。

笑谈 发表于 2013-4-17 15:25:11

Soul.art 发表于 2013-4-17 12:24 static/image/common/back.gif
这个早已经解决了,当时是速度采集的抗干扰电容取值过大,转速太高,霍尔信号被滤平了,所以PID整定得到的 ...

请问你的计数器部分怎么处理的?我的程序感觉计数器不能正常的捕捉到信号反馈给单片机。
能帮忙看看我的程序问题出在哪里吗?我是用固态继电器驱动交流电机的。槽型光栅测速,TOCKI引脚捕捉的信号也正确。

/************************************
测速度_1    控制在RPM=25000   RPMmax=30000
PIC 16F877A
Fosc = 4MHz
TMR0 做计数器
TMR1 做定时器

AC_ZERO = RA2
SPEED_MEASURE = RA4
PHOTO_OPEN = RB7
AC_PWM1 = RC2
************************************/

#include<pic.h>
#define uchar unsigned char
#define uintunsigned int
__CONFIG(0x3B31);

uint SPEED_NUM;

void delay_ms(unsigned int n); //1ms

void init()
{
        TRISC=0;        //RC2=AC_PWM1 OUTPUT
        PORTC=0xff;        //先输出高电平,此时交流电机不转
        TRISA=0xff;   //RA2=AC_ZERO(INPUT);RA4=SPEED_MEASURE(INPUT,作为计数器使用,TMR0)
        SPEED_NUM = 3;
}

unsigned int counter0()                //TMR0 脉冲 计数器 1s计数
{
        OPTION=0x21;                 //00100001   TOCKI引脚上升沿计数   1:4分频
        TMR0 = 0;
        delay_ms(1000);                //定时1000ms的时间,检测脉冲个数
        return (4*TMR0);        //实际速度为TMR0*4,因为进行过1:4分频
}

void main()        //低功率运行                       
{                                                       
        init();       
        while(1)
        {       
                counter0();
                if(counter0()<=414)        //转速过低                // 414*60=24840
                {
                        if(RA2==0)
                        {
                                PORTC=0xff;
                                SPEED_NUM--;
                                delay_ms(SPEED_NUM); //delay_ms
                                PORTC = 0x00;
                                delay_ms(1);
                        }
                }        

                if((counter0()>414)&&(counter0()<417))                        //转速刚好 RPM=24840~25020
                {
                        if(RA2==0)
                        {
                                PORTC=0xff;
                                delay_ms(SPEED_NUM);
                                PORTC = 0x00;
                                delay_ms(1);
                        }
                }
               
                if(counter0()>=417)                //转速过高        417*60=25020
                {       
                        if(RA2==0)
                        {
                                PORTC=0xff;
                                SPEED_NUM++;
                                delay_ms(SPEED_NUM); //delay_ms
                                PORTC = 0x00;
                                delay_ms(1);
                        }
                }                
        }
}

void delay_ms(unsigned int n)//1ms
{
        unsigned int i;
        unsigned int TMR1 = TMR1H<<8 + TMR1L;

        T1CON = 0b00000000;
        TMR1IF = 0;
        TMR1H = 0;
        TMR1L = 0;
        TMR1ON = 1;

        for(i=0;i<n;i++)
        {       
                TMR1L = TMR1L + 0x18;
                TMR1H = TMR1H + 0xFC;
                while(!TMR1IF);
                TMR1IF = 0;
        }
        TMR1ON = 0;
}

Soul.art 发表于 2013-4-21 19:03:02

本帖最后由 Soul.art 于 2013-4-21 19:24 编辑

你这个代码怎么这样,在脱离转速控制下,改变 SPEED_NUM 值能控制电机转速吗?

不是你这样写的,大哥
PORTC=0xff;
SPEED_NUM--;
delay_ms(SPEED_NUM); //delay_ms
PORTC = 0x00;
delay_ms(1);

检测到过零
if(RA2==0)

1.这个要在前面,开始延时触发
delay_ms(SPEED_NUM); //delay_ms

2.触发晶闸管
PORTC=0xff;
3.维持触发信号1MS
delay_ms(1);
4.关闭触发信号
PORTC = 0x00;


这样才能完成一次斩波啊。

你上面完全没有斩波嘛,过零了就触发可控硅,那不是直通了吗,你完全是在当三极管用嘛。

晶闸管的关闭不是说关掉光耦就可以让晶闸管断电的,它导通后会维持到下一个过零点才会自动关闭,跟三极管不是一码事。




Soul.art 发表于 2013-4-21 20:46:02

笑谈 发表于 2013-4-17 15:25 static/image/common/back.gif
请问你的计数器部分怎么处理的?我的程序感觉计数器不能正常的捕捉到信号反馈给单片机。
能帮忙看看我的 ...

还有这个PID算法也不是这样的,你这个算法说白了,得到的效果跟120的警笛有点类似了

NJ8888 发表于 2013-4-21 20:54:16

这说明接客要小心

笑谈 发表于 2013-4-21 23:33:10

Soul.art 发表于 2013-4-21 19:03 static/image/common/back.gif
你这个代码怎么这样,在脱离转速控制下,改变 SPEED_NUM 值能控制电机转速吗?

不是你这样写的,大哥


谢谢大哥,你说的是对的。我之前也这样试的,但是电机不转。最后分析是当计数器工作时(一次需要1s),电机得不到触发信号,不工作.后来我就干脆先关闭可控硅,后打开。还是不行的。减小计数器计数时间最后也没搞定。
我现在打算改电路,测电流了,先忽略功率因数,根据实际的电流值来调整程序中的电压设定值,
页: [1]
查看完整版本: 高速电机恒速问题(4000-40000/分钟)可调,用PWM无法控制,有图【恢复】