飞思卡尔那些事之PWM控制直流电机 收藏 [复制链接]
发表于 2010-7-11 17:10:04 |只看该作者 |倒序浏览 飞思卡尔那些事之PWM控制直流电机 收藏 资源: 1、直流电机。当直流电机的接线端电压不同时,会出现正转或反转的状态。如接线柱A和B,当A为高电平,B为低电平时,电机正转;当A为低电平,B为高电平时,电机反转。在电机允许电压范围内,电压越高,输出功率越大,转速越快,反之,输出功率越小,转速越慢。 2、HCS12的PWM输出。通过PWM输出,可以在标准的TTL电平中,输出不同的电压。以控制电机的转速和转动方向。 3、33886。电机驱动芯片,内部集成半H桥。可以通过TTL电平控制V+电平输出。最高频达10KHz。电压范围为0到40V。最大电流为5A。可以工作在-60到125摄氏度的环境下。
方案: 1、HCS12中的PWM模块,通过硬件进行PWM输出。 2、HCS12中的ECT的比较输出模块,通过比较输出进行PWM的输出。 鉴于PWM模块为输出PWM专用模块,通过设置相应寄存器即可实现PWM输出,简单方便,而且精确。故选用PWM模块进行PWM输出。
说明: 1、驱动芯片为33886。 2、16位PWM控制。 3、周期为1MS即输出1KHZ。 4、对齐方式为PWM左对齐方式。 5、输出极性为起始高电平。 6、占空比为0%~100%,在这期间分为10个档。通过按键进行变换,每按下一个按键,占空比提高一档。 7、通过级联方式实现16位PWM输出。 8、通过级联方式实现16位PWM输出。通道PWM01组成通道A;通道PWM23组成通道B; 9、时钟源选择。 BusBlock:8MHz。 PWM输出频率:1KHz。 预分频:16分频 500kHz PWMPRCLK=0x66 分频:50分频 10K ClockSX=ClockX/(2*PWMSCLX) PWMSCLx=ClockX/ClockSX*2=500k/(10k*2)=25=0x19 通过两次分频可得通道时钟周期为:100US即10HZ 通道A时钟频率选择PWMPRCLK和PWMSCLA; 通道B时钟频率选择PWMPRCLK和PWMSCLB; 周期计算公式: 左对齐方式: 输出周期=通道时钟周期*(PWMPERx+1) PWMPERx=输出周期/通道时钟周期-1 =1MS/10US-1 =9=0X09 10、占空比设置: 左对齐起始输出高电平: 占空比=[(PWMDTYx+1)/(PWMPERx+1)]*100% PWMDTYx=占空比*(PWMPERx+1)/100% 00%WMDTYx=0x00 10%WMDTYx=0x01 20%WMDTYx=0x02 30%:PWMDTYx=0x03 40%:PWMDTYx=0x04 50%:PWMDTYx=0x05 60%:PWMDTYx=0x06 70%:PWMDTYx=0x07 80%:PWMDTYx=0x08 90%:PWMDTYx=0x09 99%:PWMDTYx=0x0A
CODE: #include /* common defines and macros */ #include /* derivative information */ #pragma LINK_INFO DERIVATIVE mc9s12xs128 //===========================================================// //PWM输出,控制直流电机转动方向已经转速 //author: Yangtze //time:2009/4/17/2:15:45 //===========================================================// unsigned char Ton[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x08,} ; unsigned int Tperiod=0x09; void main(void) { PWME=0x00; PWMPRCLK=0x66; //通道时钟预分频, 16分频 PWMSCLA=0x19; //时钟A分频 , 50分频 PWMSCLB=0x19; //时钟B分频 , 50分频 PWMCLK=0x0F; //PCLK1选择ClockSA,PCLK选择ClockSB PWMPOL=0x0F; //起始输出高电平 PWMCAE=0x00; //PWM输出左对齐 PWMCTL=0x3C; //通8道01级联,通道23级联 PWMPER0=0x00; //级联通道01的周期高字节 PWMPER1=0x09; //级联通道01的周期低字节 PWMPER0=0x00; //级联通道23的周期高字节 PWMPER3=0x09; //级联通道23的周期低字节 PWMDTY0=0x00; //级联通道01的占空比高字节 PWMDTY1=Ton[8]; //级联通道01的占空比低字节 PWMDTY2=0x00; //级联通道01的占空比高字节 PWMDTY3=Ton[0]; //级联通道01的占空比低字节 PWME=0x0F; for(;;); }
//后记: //以上程序中,因为输出频率不是很高,故8位PWM输出已经够用,上述程序设置通道级联完全是多次一举。 //在选择级联与否时,一定要具体问题具体分析,不能想当然的使用,否则又可能会造成资源浪费。 //上述程序中,没有对HCS12进行PLL分频,使得HCS12的BusClock很长,在一定程度上造成了资源浪费。 //在最后运行过程中,出现了一点小问题,就是,PWM输出周期并补时计划中的1MS,而是3.5MS。示波器应该没有问题,估计是在计算周期的过程中出错,影响了结果输出。 //朋友,如果和我一样,对单片机感兴趣的话,和我一块检查一下错误的原因吧。看看谁检查到的原因时正确的。嘿嘿。 |