|
我用的方案是单片机,因为还有其他液晶等控制,打算一个芯片搞定,而且对步进精度要求不高,就是转速要求比较高,要达到10转/秒,电机是75的三相反应式步进电机(15/7.5),现在正在调试,遇到一些问题,问一下各位了,我用的是7.5的步距角,一开始没有经验,没有接电压比较器LM339,就直接用PWM控制电流了,速度差不多6转最高了,今天刚接了一个电路,图片大致如下
(原文件名:QQ截图未命名.jpg)
就是4148和VR3组成的致回没接,电源是24V的,其他都一样,单片机用STC最新的1T的,用了32M晶振,内部定时器中断使用10US中断一次,主要就是这个问题,程序基本和原来一样,就是基准改成了10US一次,但是速度还是6转上不来,LM339一检测到电流过大,最多就10US内肯定关断这一相电流了,等到电流小于3A了重新打开,最想不通的就是,我每次换拍是0.9MS,就是进入中断90次,按照理论算下来应该有23转/秒,实际只有6转,还转的很好,也不像有失步,下面是程序,
还有一个奇怪的问题BJ_SPEED_NOW和BJ_SPEED_MAX是起始速度和最大速度,我都设置成了90没有问题,感觉这个速度下电机不用加速时间
基准时间请放心,STC是1T的而且我用的是32M晶振,算下来应该没有错的
//*****************************************中断1,定时器0中断*****************************//
/*
功能:10US中断一次,为系统提供时间基准
全局变量:变量看列表
输入变量:无
输出变量:无
局部变量:无
*/
void Funtime (void) interrupt 1 using 0
{
TF0=0;
TH0=0xfe;
TL0=0xc0; //使用定时器0,周期10US;
BJ_CYCLE++; //基准时间,每次增加100US,给加速递增稳定周期使用
BJ_ADDCYCLE++; //基准时间,给加速递减周期使用
if(BJ_CYCLE>=BJ_ZCYCLE) //加速过程使用,目的每BJ_ZCYCLE个周期速度递减,保证每次递减均匀
{
BJ_CYCLE=0;
BJ_SPEED_NOW--;
if(BJ_SPEED_NOW<=BJ_SPEED_MAX){BJ_SPEED_NOW=BJ_SPEED_MAX;}
}
if(BJ_ADDCYCLE>=BJ_SPEED_NOW) //根据匀速递减后的速度,确定每次换拍的时间
{
BJ_ADDCYCLE=0;
BJ_BEAT++;if(BJ_BEAT>6){BJ_BEAT=0;}
}
switch(BJ_BEAT)//改变时序
{
case 0: {OUT_STEPA=IN_STEPA; OUT_STEPB=1; OUT_STEPC=1;} break;
case 1: {OUT_STEPA=IN_STEPA; OUT_STEPB=IN_STEPB; OUT_STEPC=1;} break;
case 2: {OUT_STEPA=1; OUT_STEPB=IN_STEPB; OUT_STEPC=1;} break;
case 3: {OUT_STEPA=1; OUT_STEPB=IN_STEPB; OUT_STEPC=IN_STEPC;}break;
case 4: {OUT_STEPA=1; OUT_STEPB=1; OUT_STEPC=IN_STEPC;}break;
case 5: {OUT_STEPA=IN_STEPA; OUT_STEPB=1; OUT_STEPC=IN_STEPC;}break;
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)
|