|
现在在做一个步进电机的驱动,有问题请教各位:
用的是57BYGH302,资料如下,![](http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_642623F2PSDP.jpg)
(原文件名:100007802323079.jpg)
驱动电路如图所示,![](http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_642624H2PPD0.jpg)
(原文件名:12121212.jpg)
用的是别的板子的,本来BSP452是用来驱动继电器的,现在改为驱动步进电机不知道行不行。接线方式是四相六线的,黑白接地,其他四根线接二极管的另一段。
驱动程序如下:
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "TY_jiancetai.h"
void SysInit(void);
void Time_Init(void);
void IO_Init(void);
interrupt 11 void ISR_Time(void)
{
time_ms++;
if(time_ms%2==0)
{
num1++;
if(num1==8) num1=0;
if(num1==0) {red1=1;yellow1=0;green1=0;blue1=0;}
if(num1==1) {red1=1;yellow1=1;green1=0;blue1=0;}
if(num1==2) {red1=0;yellow1=1;green1=0;blue1=0;}
if(num1==3) {red1=0;yellow1=1;green1=1;blue1=0;}
if(num1==4) {red1=0;yellow1=0;green1=1;blue1=0;}
if(num1==5) {red1=0;yellow1=0;green1=1;blue1=1;}
if(num1==6) {red1=0;yellow1=0;green1=0;blue1=1;}
if(num1==7) {red1=1;yellow1=0;green1=0;blue1=1;}
// if(num1==0) {yellow1=0;green1=0;blue1=0;red1=1;}
// if(num1==1) {red1=0;yellow1=1;green1=0;blue1=0;}
// if(num1==2) {red1=0;yellow1=0;green1=1;blue1=0;}
// if(num1==3) {red1=0;yellow1=0;green1=0;blue1=1;}
}
/********** 1s *************/
if(time_ms==1000)
{
time_ms=0;
if(time_init)time_init--;
}
j= TPM1SC_TOF ;
TPM1SC_TOF=0;
}
void SysInit(void)
{
SOPT = 1<<7| //看门狗定时器(1):0,禁止;1,使能
1<<6| //看门狗溢出周期(1):1,2^18;0,2^13
0<<5; //STOP模式(0):1,使能;0,禁止
ICGC1 = 0<<7| //晶振选择:1,高增益;0,低电压
0<<6| //频率范围选择:1,高频P=1;0,低频P=64
0<<5| //0:外部时钟输入;1,振荡器或
0<<4| /*******bit4,bit3-时钟模式选择*************/
0<<3| /*00:self clock,01:内部时钟,10:外部,11外部*/
0<<2| //OFF MODE振荡器:1,使能;0,禁止
0<<1| //时钟丢失检测:0:使能;1,禁止
0<<0; //保留
ICGC2 = 0<<7| //ICG频率降低时:1,产生中断;0,产生复位
0<<6| /********bit6-bit4:倍频因子N****************/
0<<5| /* 000-> 4;001-> 6;010-> 8;011->10 */
0<<4| /* 100->12;101->14;110->16;111->18 */
0<<3| //系统频率降低时:1,产生中断;0,产生复位
0<<2| /********bit6-bit4:分频因子R****************/
0<<1| /* 000-> 1;001-> 2;010-> 4;011-> 8 */
1<<0; /* 100->16;101->32;110->64;111->132 */
Time_Init(); //定时器初始化
IO_Init();
time_init=1;
}
void Time_Init(void)
{
TPM1SC = 0<<7| //定时器1溢出标志
1<<6| //溢出中断使能
0<<5| //PWM中心选择:0,由MSnB:MSnA决定;1,所有的TPMx
0<<4| /********bit4,bit3-时钟源选择***********/
1<<3| /*00:禁止,01:BUSCLK,10:XCLK,11:外部时钟*/
0<<2| /******bit2,bit1,bit0-分频系数**********/
0<<1| /* 000-> 1,001-> 2,010-> 4,011-> 8 */
0<<0; /* 100->16,101->32,110->64,111->128 */
TPM1MODH=0x03; //0x03E8==1000
TPM1MODL=0xE8;
}
void IO_Init(void)
{
/********步进电机引脚驱动********/
DDR_red1=1;
red1=0;
DDR_yellow1=1;
yellow1=0;
DDR_green1=1;
green1=0;
DDR_blue1=1;
blue1=0;
PTDDD_PTDDD7=1; //LED测试
}
void main(void)
{
SysInit();
EnableInterrupts; /* enable interrupts */
while(time_init)__RESET_WATCHDOG();
for(;;)
{
__RESET_WATCHDOG(); /* feeds the dog */
}
}
现在测试的是只有在8拍的时候驱动能力最大,在四拍的时候用手都可以轻易握住,可是在在8拍的时候会有嗡嗡叫的声音,而且只能够2ms驱动一次,在1ms时出现电机转子不转动,只有嗡嗡叫的现象,而大于2ms时会出现卡的感觉,而且振动很大,我想请问各位能有什么办法消除这个声音吗?不确定是声音还是振动,因为那在手上的时候声音不大,固定在桌子上时声音很响。有什么好的解决方案?
上传一下波形图:![](http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_642675BWR188.JPG)
(原文件名:TEK0000.JPG) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|