8第八章 电机驱动模块Word下载.docx
- 文档编号:19857991
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:13
- 大小:490.22KB
8第八章 电机驱动模块Word下载.docx
《8第八章 电机驱动模块Word下载.docx》由会员分享,可在线阅读,更多相关《8第八章 电机驱动模块Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
直流电机的正转,反转,调速,停止(刹车与滑行),电流电机的测速
资源准备
等效原理图及电路分析
如上图所示,直流电机的驱动程序需要液晶、滚轮、Tiva的PWM输出、定时器等多个模块的共同配合完成。
其中液晶用于显示电机转数、滚轮用来调节PWM的占空比从而控制电机的转速、PWM输出用于驱动直流电机旋转、而定时器则是用来检测电机的旋转数度。
关键代码分析
PWM驱动信号的初始化
/********************************************************************
*初始化PWM获取一路脉宽调制信号
*————————|
//|
*M4PB4|-->
M0PWM2---------Channel1
//________|
********************************************************************/
#definePERIOD_TIME12500/60//20KHz//DC_motor
//60KHzDCSource
//定义最大最小周期时间频率在200~1000之间
#defineMAX_PERIODPERIOD_TIME*90/100
#defineMIN_PERIODPERIOD_TIME*12/100
voidInit_PWM()
{
//设置PWM时钟和系统时钟一致
SysCtlPWMClockSet(SYSCTL_PWMDIV_1);
//使能PWM外设
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);
//使能外设端口
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
//设置对应管脚的PWM信号功能
GPIOPinConfigure(GPIO_PB4_M0PWM2);
//设置PWM信号端口
GPIOPinTypePWM(GPIO_PORTB_BASE,GPIO_PIN_4);
//PWM生成器配置
PWMGenConfigure(PWM0_BASE,PWM_GEN_1,PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_NO_SYNC);
//设置PWM信号周期
PWMGenPeriodSet(PWM0_BASE,PWM_GEN_1,PERIOD_TIME);
//设置PWM信号占空比
PWMPulseWidthSet(PWM0_BASE,PWM_OUT_2,PERIOD_TIME/10);
//使能PWM输出端口
PWMOutputState(PWM0_BASE,PWM_OUT_2_BIT,true);
//使能PWM生成器
PWMGenEnable(PWM0_BASE,PWM_GEN_1);
//使能PWm生成器模块的及时功能.
PWMSyncTimeBase(PWM0_BASE,PWM_GEN_1);
}
定时器Timer3初始化
*@brief初始化Timer3A为边沿触发减计数中断。
PB2作为外部中断源获取中断信号。
*捕获采用统计两路光耦信号之间的时间差来折算电机叶轮旋转数度
*@paramnull
*@returnnull
********************************************************************/
voidInit_Timer()
//启用Timer4模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER3);
//启用GPIO_M作为脉冲捕捉脚
//配置GPIO脚为使用Timer4捕捉模式
GPIOPinConfigure(GPIO_PB2_T3CCP0);
GPIOPinTypeTimer(GPIO_PORTB_BASE,GPIO_PIN_2);
//为管脚配置弱上拉模式
GPIOPadConfigSet(GPIO_PORTB_BASE,GPIO_PIN_2,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);
//配置使用Timer4的TimerA模块为边沿触发减计数模式
TimerConfigure(TIMER3_BASE,TIMER_CFG_SPLIT_PAIR|TIMER_CFG_A_CAP_COUNT);
//使用下降沿触发
TimerControlEvent(TIMER3_BASE,TIMER_A,TIMER_EVENT_NEG_EDGE);
//设置计数范围为0x4~0X0
TimerLoadSet(TIMER3_BASE,TIMER_A,0x4);
TimerMatchSet(TIMER3_BASE,TIMER_A,0x0);
//注册中断处理函数以响应触发事件
TimerIntRegister(TIMER3_BASE,TIMER_A,Timer3AIntHandler);
//系统总中断开
IntMasterEnable();
//时钟中断允许,中断事件为Capture模式中边沿触发,计数到达预设值
TimerIntEnable(TIMER3_BASE,TIMER_CAPA_MATCH);
//NVIC中允许定时器A模块中断
IntEnable(INT_TIMER3A);
//启动捕捉模块
TimerEnable(TIMER3_BASE,TIMER_A);
关于中断函数的初始化和调用参考第三章中按键中断的实现部分,这里不再重复说明。
初始化中的计算范围定在4~0,即四次边沿触发即响应中断函数。
是由于直流电机的叶轮上有四个对称的缺口,而在电机模块PCB中的光耦对管正好能捕获叶轮上的缺口产生一组信号。
这组信号通过PB2获得,并触发中断函数的响应。
*@brief光耦信号触发中断函数响应,通过主频和主频计数差值换算出电机的转速
*******************************************************************/
//记录前次和当前的系统计数值用于鉴别中断响应状况
uint32_told_tick,cur_tick=0;
//计算前后两次中断的时间间隔,用于计算电机叶轮的频率
uint32_ttick_delay=0;
//记录前次和当前的电机叶轮的频率
floatcur_frequency,old_frequency=0.0;
voidTimer3AIntHandler(void)
unsignedlongulstatus;
//读取中断标志位
ulstatus=TimerIntStatus(TIMER3_BASE,TIMER_CAPA_MATCH);
if(ulstatus==TIMER_CAPA_MATCH)
//获取当前系统时钟值
cur_tick=ROM_SysTickValueGet();
//清除中断标志位
TimerIntClear(TIMER3_BASE,ulstatus);
//因为减计数会自动停止,所以需要重新启用计数模块
//得到响应两次中断之间的系统时间计数差值
if(old_tick>
cur_tick)
tick_delay=old_tick-cur_tick;
//保留本次中断结束时的系统计数值,用于下次统计时间差的依据
old_tick=cur_tick;
}
得到了两次中断之间的系统计数值,变可以根据主频来换算出电机的运转频率,如下所示:
//系统主频除以两次中断的系统计数值=频率
cur_frequency=(1.0*TIVA_MAIN_FREQUENCY)/tick_delay;
剩下的只要通过LCD的驱动函数将换算得到的频率值显示在LCD即可。
数据测试与分析
E.步进电机的控制
双极永磁步进电机的转动控制,不同的通电控制方式可以产生不同的步距角(单拍和双拍);
步进电机的反转
1、降低主频:
//系统时钟设置
SysCtlClockSet(SYSCTL_SYSDIV_64|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|
SYSCTL_XTAL_16MHZ);
由于步进电机的驱动PWM信号频率一般都在几十赫兹的水平上,而Tiva的常用工作频率在12.5MHz。
所以在使用计时器做PWM波的生成时,我们采用系统时钟分频的方式降低Tiva主频来产生频率较低的PWM波形。
2、四路PWM波的初始化:
*@brief初始化PWM获取四组脉宽调制信号用于步进电机的驱动
//TIVA|
*M4PB7|-->
M0PWM1---------Channel1
//M4PB4|-->
M0PWM2---------Channel2
*M4PF1|-->
M1PWM5---------Channel3
*M4PF2|-->
M1PWM6---------Channel4
#definePERIOD_TIME0x1FFFF
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinConfigure(GPIO_PB7_M0PWM1);
GPIOPinConfigure(GPIO_PF1_M1PWM5);
GPIOPinConfigure(GPIO_PF2_M1PWM6);
GPIOPinTypePWM(GPIO_PORTB_BASE,GPIO_PIN_4|GPIO_PIN_7);
GPIOPinTypePWM(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2);
PWMGenConfigure(PWM0_BASE,PWM_GEN_0,PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_NO_SYNC);
PWMGenConfigure(PWM1_BASE,PWM_GEN_2,PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_NO_SYNC);
PWMGenConfigure(PWM1_BASE,PWM_GEN_3,PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet(PWM0_BASE,PWM_GEN_0,PERIOD_TIME);
PWMGenPeriodSet(PWM1_BASE,PWM_GEN_2,PERIOD_TIME);
PWMGenPeriodSet(PWM1_BASE,PWM_GEN_3,PERIOD_TIME);
PWMPulseWidthSet(PWM0_BASE,PWM_OUT_1,PERIOD_TIME/2);
PWMPulseWidthSet(PWM0_BASE,PWM_OUT_2,PERIOD_TIME/2);
PWMPulseWidthSet(PWM1_BASE,PWM_OUT_5,PERIOD_TIME/4);
PWMPulseWidthSet(PWM1_BASE,PWM_OUT_6,PERIOD_TIME/4);
PWMOutputState(PWM0_BASE,PWM_OUT_1_BIT|PWM_OUT_2_BIT,true);
PWMOutputState(PWM1_BASE,PWM_OUT_5_BIT|PWM_OUT_6_BIT,true);
PWMGenEnable(PWM0_BASE,PWM_GEN_0);
PWMGenEnable(PWM1_BASE,PWM_GEN_2);
PWMGenEnable(PWM1_BASE,PWM_GEN_3);
//延时同步四路PWM信号
PWMSyncTimeBase(PWM0_BASE,PWM_GEN_1_BIT);
SysCtlDelay((PERIOD_TIME/2));
PWMSyncTimeBase(PWM0_BASE,PWM_GEN_0_BIT);
SysCtlDelay((PERIOD_TIME*7/8));
PWMSyncTimeBase(PWM1_BASE,PWM_GEN_3_BIT);
SysCtlDelay((PERIOD_TIME/2));
PWMSyncTimeBase(PWM1_BASE,PWM_GEN_2_BIT);
完成了PWM的初始化后,步进电机便能转动了。
3、步进电机转速滚轮调节:
在程序的出循环中假如滚轮调节PWM周期的逻辑可调节电机的转动速度。
主要代码如下所示:
while
(1)
{
ADCProcessorTrigger(ADC_BASE,SequenceNum);
//等待完成取样转换
while(!
ADCIntStatus(ADC_BASE,SequenceNum,false))
//清楚ADC中断标志位
ADCIntClear(ADC_BASE,SequenceNum);
//读取ADC采样值
ADCSequenceDataGet(ADC_BASE,SequenceNum,pui32ADC0Value);
//当前周期转化公式
cur_Period=MIN_PERIOD+((MAX_PERIOD-MIN_PERIOD)*pui32ADC0Value[0])/4096;
//记录ADC的变化率大小
uint32_ttemp=0;
if(cur_Period>
old_Period)
temp=cur_Period-old_Period;
}else{
temp=old_Period-cur_Period;
//ADC实现16级的有极变化,
if(temp>
0xFFF)
//调整周期
PWMGenPeriodSet(PWM0_BASE,PWM_GEN_0,cur_Period);
PWMGenPeriodSet(PWM0_BASE,PWM_GEN_1,cur_Period);
PWMGenPeriodSet(PWM1_BASE,PWM_GEN_2,cur_Period);
PWMGenPeriodSet(PWM1_BASE,PWM_GEN_3,cur_Period);
//调整占空比
PWMPulseWidthSet(PWM0_BASE,PWM_OUT_1,cur_Period/2);
PWMPulseWidthSet(PWM0_BASE,PWM_OUT_2,cur_Period/2);
PWMPulseWidthSet(PWM1_BASE,PWM_OUT_5,cur_Period/4);
PWMPulseWidthSet(PWM1_BASE,PWM_OUT_6,cur_Period/4);
//延时调整
SysCtlDelay((cur_Period/2));
SysCtlDelay((cur_Period*7/8));
SysCtlDelay((cur_Period/2));
//计算电机转数
speed=ROM_SysCtlClockGet()/cur_Period;
old_Period=cur_Period;
F.高亮LED的驱动与电流检测
应用电机控制芯片内部的H桥式电路,辅以外围电流检测电路和单片机反馈控制可以形成一个数字电源。
应用这个电源组成一个高亮LED的驱动电路
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 8第八章 电机驱动模块 第八 电机 驱动 模块
![提示](https://static.bdocx.com/images/bang_tan.gif)