再发帖,请教AVR PWM---正余波 驱动步进电机问题。附电路简图。
搞了多日,问题依然。请高人出手。
电机为两相,1.8度电机。
主要问题是:.电机低转速时,振动很大。细分不正常,转起来是一格一格的。应该是没有细分到。
无米,无相机,随手手机拍的。
电路驱动简图。A相 与B相电路相同。
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_465189.jpg
(原文件名:QQ截图未命名.jpg)
附电机波形图。这图是上面电路中的 TEST点的波形。
问题是图中为什么波形不连续的呢?
上面的是B相,下面的是A相
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_465174.jpg
(原文件名:IMG0192A.jpg)
也附个图:我是RC滤波 波形是连续的。
这两相波形都有。
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_465186.jpg
(原文件名:IMG0178A.jpg)
附细分表:
//象限 余弦波 正弦波
Step_Quadrant0 , 200 , 0 ,
Step_Quadrant0 , 196 , 39 ,
Step_Quadrant0 , 185 , 77 ,
Step_Quadrant0 , 166 , 111 ,
Step_Quadrant0 , 141 , 141 ,
Step_Quadrant0 , 111 , 166 ,
Step_Quadrant0 , 77 , 185 ,
Step_Quadrant0 , 39 , 196 ,
Step_Quadrant1 , 0 , 200 ,
Step_Quadrant1 , 39 , 196 ,
Step_Quadrant1 , 77 , 185 ,
Step_Quadrant1 , 111 , 166 ,
Step_Quadrant1 , 141 , 141 ,
Step_Quadrant1 , 166 , 111 ,
Step_Quadrant1 , 185 , 77 ,
Step_Quadrant1 , 196 , 39 ,
Step_Quadrant2 , 200 , 0 ,
Step_Quadrant2 , 196 , 39 ,
Step_Quadrant2 , 185 , 77 ,
Step_Quadrant2 , 166 , 111 ,
Step_Quadrant2 , 141 , 141 ,
Step_Quadrant2 , 111 , 166 ,
Step_Quadrant2 , 77 , 185 ,
Step_Quadrant2 , 39 , 196 ,
Step_Quadrant3 , 0 , 200 ,
Step_Quadrant3 , 39 , 196 ,
Step_Quadrant3 , 77 , 185 ,
Step_Quadrant3 , 111 , 166 ,
Step_Quadrant3 , 141 , 141 ,
Step_Quadrant3 , 166 , 111 ,
Step_Quadrant3 , 185 , 77 ,
Step_Quadrant3 , 196 , 39
};
问题是:
1.电机低转速时,振动很大。细分不正常,转起来是一格一格的。应该是没有细分到。
2.电机波形图中为什么波形不连续的呢?
有需要可贴程序。 楼主的电路是不能正常工作的
没有自举电容
GS间的电阻不用接尤其是上臂更是不能接 TO【1楼】 shinehjx
我上面的图少了一个二极管。
再上图,这个图是一个商品驱动器的原理图。应该是正确的。
在高速转的时候声音和振动都很小,就是在低速的时候,感觉没有细分。
请指教。
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_465213.jpg
(原文件名:MOTO.jpg) 高人啊,我在呼唤你啊。快出来帮帮忙吧。
看戏的人多!没人帮帮我啊? 你是怎么判断低速时没有细分呢?低速时给1600个脉冲能转一圈吗? 没看到续流二极管. to【4楼】 wayhe
在低速时,他能转动。但是转起来是一跳一跳的。像我上面的8分细,如果正常的话,应该能感觉到很小的振动。但是我的却很大。
TO 【5楼】
这个管子本身也带有的啊。
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_465572.jpg
(原文件名:QQ截图未命名.jpg) 如果是八细分应该是1600个脉冲步进电机转一圈,LZ先测试一下你的驱动器多少个脉冲能让步进电机转一周再说 我不是看戏的哦!
加大自举电容看看。 我明天上8细分时电机转一周的脉冲数 数据。
谢谢
--------------------------------
TO【8楼】 ellison909
我不是看戏的哦!
加大自举电容看看。
--------------------------------
谢谢。
这个我还真的没想过,好天也试试。
另外我还有一点不明白的事,以下的两个图,一个是单片机PWM --》RC后的正弦波,另一个是驱动步进机后电流采样电阻的波形,
那图中的圆圈中的不连续波形,不知道是怎么回事?
开始我坏疑是驱动管的死区电压,但后来生成带直流分量,但这样还是出现下图不连续的波形,实在是搞不清楚啦。
高人指教啊!!!!
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_465727.jpg
(原文件名:ourdev_465174.jpg) \\http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_465728.jpg
(原文件名:ourdev_465186.jpg) 冒昧的问一句,楼主用什么电路做的斩波恒流?
图中似乎没有看到,
既然没有斩波恒流部分,
何来电流细分一说?
愿听楼主高见 回
---------------------------------
【10楼】 lovework
冒昧的问一句,楼主用什么电路做的斩波恒流?
图中似乎没有看到,
既然没有斩波恒流部分,
何来电流细分一说?
愿听楼主高见
---------------------------------
其实我的电路很简单,也就是 上图驱动电路 + M16单片机+电流检测,
用M16的 两个PWM 输出去控制IR2104 使能端实现调压(电压稳定,其实也就是调电流)
由面上的图应该可以看得出来。
但这种方法,电路简单,但电机的上不了很高速的。 单片机产生的波形不正确,第二张图RC滤波出来的波形相位不对,正确应该是相差180度。
既然电路很简单为何不贴完整的上来?瞎子摸象的样子很难解决问题,如果电路保密估计大家都很难帮到你。
如果经验不足建议还是选专用驱动芯片来做成功率会高很多,而且性能也要比你这个好不少。 cyxavr 又一天:我觉得是你的电路没有恒流?你的PWM是可以改变电流大小,是可以得到正弦波。但细分讲究的是恒流,不是恒压。流过电机的相电流与:输入电压、线圈电感、PWM导通时间有关,如果你没有电流取样再调节PWM占空比恒定电流,那你的电路就不能实现细分了。如果没有准确的恒流,在高低速都有步距不均匀的问题,只是在低速的时候问题比较明显,高速的时候你没有擦觉到而已。 TO【13楼】wayhe
想了一下,13楼讲的也有道理。
不知道【13楼】兄弟,有无简单点电流采方法呢?
上原理图,不过采样电流还没有画。
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_465808.jpg
(原文件名:MOTO_D.jpg)
上面电路电流采样的没有画。
我现在买了HCNR200
想按这个电路采样,不知可否?
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_465809.jpg
(原文件名:MOTO_D_D.jpg)
晶振:16MHZ
CPU:M16
IAR AVR 4.3版
struct Motor2P_COR
{
unsigned int mTableId;//细分表ID
unsigned char mDirect;//马达走动方向
unsigned int mStepCount;//细分表走动步长。1-2-4-8-16 ~200 其实就是设置细分用的
};
struct Motor2P_PWM
{
unsigned char mQuadrant;//象限0-3
unsigned char mB_Pwm;//x输出的PWM
unsigned char mA_Pwm;//y输出的PWM
};
先发程序
//象限 余弦波 正弦波
Step_Quadrant0 , 200 , 0,
Step_Quadrant0 , 196 , 39 ,
Step_Quadrant0 , 185 , 77 ,
Step_Quadrant0 , 166 , 111 ,
Step_Quadrant0 , 141 , 141 ,
Step_Quadrant0 , 111 , 166 ,
Step_Quadrant0 , 77 , 185 ,
Step_Quadrant0 , 39 , 196 ,
Step_Quadrant1 , 0 , 200 ,
Step_Quadrant1 , 39 , 196 ,
Step_Quadrant1 , 77 , 185 ,
Step_Quadrant1 , 111 , 166 ,
Step_Quadrant1 , 141 , 141 ,
Step_Quadrant1 , 166 , 111 ,
Step_Quadrant1 , 185 , 77 ,
Step_Quadrant1 , 196 , 39 ,
Step_Quadrant2 , 200 , 0 ,
Step_Quadrant2 , 196 , 39 ,
Step_Quadrant2 , 185 , 77 ,
Step_Quadrant2 , 166 , 111 ,
Step_Quadrant2 , 141 , 141 ,
Step_Quadrant2 , 111 , 166 ,
Step_Quadrant2 , 77 , 185 ,
Step_Quadrant2 , 39 , 196 ,
Step_Quadrant3 , 0 , 200 ,
Step_Quadrant3 , 39 , 196 ,
Step_Quadrant3 , 77 , 185 ,
Step_Quadrant3 , 111 , 166 ,
Step_Quadrant3 , 141 , 141 ,
Step_Quadrant3 , 166 , 111 ,
Step_Quadrant3 , 185 , 77 ,
Step_Quadrant3 , 196 , 39
};
void timer1_init(void)
{
TCCR1B = 0x00;
TCCR1A = 0x00;
ICR1=255;//这里比较输出的TOP值
OCR1A=0;
OCR1B=200; //AB相位相差90度
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11); // OCR1X时清0TOP 时置位
TCCR1B = (1<<CS10)|(1<<WGM13)|(1<<WGM12);// 8位的快速PWM
}
void Motor_Init(void)
{
sMotor2P.mStepCount=1;
//mNum_C= 10;//初始化
Step_OutMode();
}
void init(void)
{
CLI();
port_init();
timer1_init();
// timer0_init();
//timer2_init();
// Motor_Init();//马达初始化
MCUCR = 0x00;
GICR= 0x20;//INT2中断
TIMSK = 0x03; //timer interrupt sources
SEI();
}
#pragma vector=INT2_vect
__interrupt void INT2_vect_ISR(void)
{
Motor_Step_one( sMotor2P.mDirect );
InMotor_Energy( sMotor2P.mTableId,mNum_C);
}
主要函数:
void InMotor_Energy(unsigned int Mid,unsigned char mNum)
{
const struct Motor2P_PWM __flash*pc_Motor2P_Table;
static unsigned char C_DIR;
unsigned int A,B;
pc_Motor2P_Table=&cMotor2P_Table;
//B=(unsigned int)(( pc_Motor2P_Table->mB_Pwm *mNum_C) >>4);// 余弦
//A=(unsigned int)(( pc_Motor2P_Table->mA_Pwm *mNum_C) >>4);//正弦
B=(unsigned int)( pc_Motor2P_Table->mB_Pwm ) ;// 余弦
A=(unsigned int)( pc_Motor2P_Table->mA_Pwm ) ;//正弦
CLI();
C_DIR= pc_Motor2P_Table->mQuadrant;
OCR1B=B; //B_PWM余弦
OCR1A=A; //A_PWM正弦
switch (C_DIR)
{
case 1:EN_B=0;EN_A=1;break;
case 2:EN_A=1;EN_B=1;break;
case 3:EN_B=1;EN_A=0;break;
case 4:EN_A=0;EN_B=0;break;
default: break;
}
SEI();
}
void Motor_Step_one(unsigned char F_DIR)
{
if(F_DIR)//顺时针
{
if(sMotor2P.mTableId==0)
sMotor2P.mTableId=sizeof( cMotor2P_Table)/sizeof( struct Motor2P_PWM)-sMotor2P.mStepCount;
else
sMotor2P.mTableId-=sMotor2P.mStepCount;
}
else//反转
{
sMotor2P.mTableId+=sMotor2P.mStepCount;
if(sMotor2P.mTableId >= (sizeof(cMotor2P_Table)/sizeof(struct Motor2P_PWM))) sMotor2P.mTableId=0;
}
}
主函数:
void main(void)
{
init();
while(1)
{}
} bu dong TO LZ看你提供的电路图没有电流反馈控制,只是用PWM直接输出类SPWM波,这样不可能控制步进电机电流按正余弦规律变化,细分更是无从谈起了。 都站在同一“地”上,直接采样吧,不用隔离。 先谢谢各位的帮忙。
看了各位的回复,我原来没有电流采样,控制不了细分。
没经验,第一次搞驱动器。
我上面的图如果不隔离直接用AD采样的话,会不会对单片机有影响?
因为电机的驱动电压是30V
电流可以去到5A的,怎么大个电流单片机受得了吗? 可以直接用AD采样,布线合理的前提下,既使是50A对单片机也不会有影响
楼主你这个方案随你怎么弄性能也是好的有限,建议你还是加入硬件恒流斩波,或直接采用专用驱动芯片,5A可以用A3986+MOSFET做,性能绝对要比你这个方案好n倍 TO 【19楼】 shinehjx
你的硬件恒流斩波,意思是不是 加个TLC7528再加个运放CA084与LM339之类的方案?
可否详细指点下“硬件恒流斩波”? 细分驱动通常是由:逻辑时序->DAC->斩波控制->功率输出 组成。
↑ |
|________|
斩波控制常用的是L6506,也可以用比较器加触发器搭,在本坛搜索“细分”或“步进电机”结果中会有你想要的。 前面提到的低速振动大的问题,原因已找到,
是一个很低级的错误。
解决方法:将原来的PWM端与EN使能端对调。
再改变正余弦表,
改为:
中值:128(最大8位,255)
正负偏一个数值(小到128)构成正余波。 现在试验结果怎么样了? 现在低速很安静,细分也正常。
现在正在加入电流采样功能。 想知道楼主现在搞的怎么样了?我也想学习这块!楼主给个联系方式吧! 没有暂波 何来恒流 学习了 可以使用TMC457实现正弦波电流驱动以保证在低速的时候或者在加减速度的时候也不会出现抖动
点击此处下载 ourdev_535483.pdf(文件大小:5.34M) (原文件名:TMC457-Motion-Controller_02-2009.pdf)
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_535484.gif
(原文件名:2.gif) 学习了 学习了{:handshake:} mark,学习下
页:
[1]