8第八章 电机驱动模块.docx
《8第八章 电机驱动模块.docx》由会员分享,可在线阅读,更多相关《8第八章 电机驱动模块.docx(13页珍藏版)》请在冰豆网上搜索。
8第八章电机驱动模块
第一章.电机驱动模块
一、实验目的
●理解直流电机的相数,掌握用PWM控制直流电机正转反转、调速、停止(刹车与滑行);
●理解步进电机的转动角度和不同相的连接方式,掌握不同的绕组通电方式来控制转动角度;
●理解H桥的工作原理和不同的衰减模式;
●电机测速的原理;
●电机驱动模块做成恒流源的原理与应用—高亮LED恒流驱动
二、预备知识点
三、实验模块介绍
A.硬件电路总体介绍
硬件配置框图
PCB布局及电路板上拔动开关的物理位置展示
B.软件总体介绍
说明电机驱动不同的相上不同的电流控制的原理,解释需要的PWM的时序按排。
四、实验及测试
C.概述
模块支持的实验项目
直流电机的控制与测速
步进电机的控制
高亮LED的驱动与电流检测
D.直流电机的控制与测速
实验内容
直流电机的正转,反转,调速,停止(刹车与滑行),电流电机的测速
资源准备
等效原理图及电路分析
如上图所示,直流电机的驱动程序需要液晶、滚轮、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作为脉冲捕捉脚
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
//配置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光耦信号触发中断函数响应,通过主频和主频计数差值换算出电机的转速
*@paramnull
*@returnnull
*******************************************************************/
//记录前次和当前的系统计数值用于鉴别中断响应状况
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);
//因为减计数会自动停止,所以需要重新启用计数模块
TimerEnable(TIMER3_BASE,TIMER_A);
//得到响应两次中断之间的系统时间计数差值
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
voidInit_PWM()
{
//设置PWM时钟和系统时钟一致
SysCtlPWMClockSet(SYSCTL_PWMDIV_1);
//使能PWM外设
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1);
//使能外设端口
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
//设置对应管脚的PWM信号功能
GPIOPinConfigure(GPIO_PB7_M0PWM1);
GPIOPinConfigure(GPIO_PB4_M0PWM2);
GPIOPinConfigure(GPIO_PF1_M1PWM5);
GPIOPinConfigure(GPIO_PF2_M1PWM6);
//设置PWM信号端口
GPIOPinTypePWM(GPIO_PORTB_BASE,GPIO_PIN_4|GPIO_PIN_7);
GPIOPinTypePWM(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2);
//PWM生成器配置
PWMGenConfigure(PWM0_BASE,PWM_GEN_0,PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_NO_SYNC);
PWMGenConfigure(PWM0_BASE,PWM_GEN_1,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);
//设置PWM信号周期
PWMGenPeriodSet(PWM0_BASE,PWM_GEN_0,PERIOD_TIME);
PWMGenPeriodSet(PWM0_BASE,PWM_GEN_1,PERIOD_TIME);
PWMGenPeriodSet(PWM1_BASE,PWM_GEN_2,PERIOD_TIME);
PWMGenPeriodSet(PWM1_BASE,PWM_GEN_3,PERIOD_TIME);
//设置PWM信号占空比
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);
//使能PWM输出端口
PWMOutputState(PWM0_BASE,PWM_OUT_1_BIT|PWM_OUT_2_BIT,true);
PWMOutputState(PWM1_BASE,PWM_OUT_5_BIT|PWM_OUT_6_BIT,true);
//使能PWM生成器
PWMGenEnable(PWM0_BASE,PWM_GEN_0);
PWMGenEnable(PWM0_BASE,PWM_GEN_1);
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);
//延时调整
PWMSyncTimeBase(PWM0_BASE,PWM_GEN_1_BIT);
SysCtlDelay((cur_Period/2));
PWMSyncTimeBase(PWM0_BASE,PWM_GEN_0_BIT);
SysCtlDelay((cur_Period*7/8));
PWMSyncTimeBase(PWM1_BASE,PWM_GEN_3_BIT);
SysCtlDelay((cur_Period/2));
PWMSyncTimeBase(PWM1_BASE,PWM_GEN_2_BIT);
//计算电机转数
speed=ROM_SysCtlClockGet()/cur_Period;
old_Period=cur_Period;
}
F.高亮LED的驱动与电流检测
实验内容
应用电机控制芯片内部的H桥式电路,辅以外围电流检测电路和单片机反馈控制可以形成一个数字电源。
应用这个电源组成一个高亮LED的驱动电路
资源准备
等效原理图及电路分析