8第八章 电机驱动模块Word下载.docx

上传人:b****5 文档编号:19857991 上传时间:2023-01-11 格式:DOCX 页数:13 大小:490.22KB
下载 相关 举报
8第八章 电机驱动模块Word下载.docx_第1页
第1页 / 共13页
8第八章 电机驱动模块Word下载.docx_第2页
第2页 / 共13页
8第八章 电机驱动模块Word下载.docx_第3页
第3页 / 共13页
8第八章 电机驱动模块Word下载.docx_第4页
第4页 / 共13页
8第八章 电机驱动模块Word下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

8第八章 电机驱动模块Word下载.docx

《8第八章 电机驱动模块Word下载.docx》由会员分享,可在线阅读,更多相关《8第八章 电机驱动模块Word下载.docx(13页珍藏版)》请在冰豆网上搜索。

8第八章 电机驱动模块Word下载.docx

直流电机的正转,反转,调速,停止(刹车与滑行),电流电机的测速

资源准备

等效原理图及电路分析

如上图所示,直流电机的驱动程序需要液晶、滚轮、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的驱动电路

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 兵器核科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1