黄金军的论文正文 联系客服

发布时间 : 星期一 文章黄金军的论文正文更新完毕开始阅读

本科毕业设计说明书(论文)

还原为模拟形式。

第 21 页 共 30 页

信距离。在接收端,通过适当的RC或LC网络可以滤除调制高频方波并将信号

总之,PWM既经济、节约空间、抗噪性能强,是一种值得广大工程师在许多设计应用中使用的有效技术。 (3)小车速度控制的实现

小车电机的正常工作电压是不能改变的,于是可以考虑利用PWM波来控制流入电机内部的电流。T/C0是8位的定时计数器,它有4种工作模式,分别是:普通模式,CTC(比较匹配时清除定时器)模式,快速PWM模式,相位修正PWM模式。针对本课题的实际情况,选择T/C0工作于相位修正PWM模式比较好。

相位修正PWM模式(WGM01:0=1)为用户提供了一个获得高精度相位修正PWM波形的方法。此模式基于双斜线操作。计时器重复地从BOTTOM计到MAX,然后又从MAX倒退回到BOTTOM。在一般的比较输出模式下,当计时器往MAX计数时若发生了TCNT0于OCR0的匹配,OC0将清零为低电平;而在计时器往BOTTOM计数时若发生了TCNT0于OCR0的匹配,OC0将置位为高电平。工作于反向输出比较时则正好相反。与单斜线操作相比,双斜线操作可获得的最大频率要小。但由于其对称的特性,十分适合于电机控制。

相位修正PWM模式的PWM精度固定为8比特。计时器不断地累加直到MAX,然后开始减计数。在一个定时器时钟周期里TCNT0的值等于MAX。

相位修正PWM模式的时序图如下图4.7所示:

本科毕业设计说明书(论文)

第 22 页 共 30 页

图4.7相位修正PWM模式的时序图

图4.7中,TCNT0的数值用柱状图表示,以说明双斜线操作。该图同时说明了普通PWM的输出和反向PWM的输出。TCNT0斜线上的小横条表示OCR0和TCNT0的匹配。

工作于相位修正模式时PWM频率可由下式公式获得:

fOCnPCPWM?fclk_I/ON?510

变量N表示预分频因子(1、8、32、64、128、256或1024)。

T/C0的时钟问题:T/C0可以由内部同步时钟或外部异步时钟驱动,CLKT0缺省设置为MCU时钟CLKI/O,当ASSR的AS0置位时,时钟源取自连接于TOSC1和TOSC2的振荡器。

T/C0控制寄存器(TCCR0)如图4.8

图4.8 T/C0控制寄存器(TCCR0)

FOC0在非PWM模式才有效,在使用PWM时要将其清零。

COM01:0设置比较匹配输出模式,当T/C0工作于相位修正PWM模式,

本科毕业设计说明书(论文)

第 23 页 共 30 页

COM01:0=0B10时,在升序计数时发生比较匹配将清零OC0;降序计数时发生比较匹配将置位OC0,此时的PWM波占空比(OCR0值)∕0XFF。

CS02:0用于选择T/C的时钟源,当CS02:0=0B000时,表示无时钟,T/C不工作;当CS02:0=0B010时,T/C的时钟源频率为CLKTOS/8(来自预分频器)。

T/C寄存器——TCNT0如图4.9

图4.9 T/C寄存器——TCNT0

通过T/C寄存器可以直接对计数器的8位数据进行读写访问。对TCNT0寄存器的写访问将在下一个时钟阻止比较匹配。在计数器运行的过程中修改TCNT0的数值有可能丢失一次TCNT0和OCR0的比较匹配。

输出比较寄存器——OCR0如图4.10

图4.10 输出比较寄存器——OCR0

输出比较寄存器包含一个8位的数据,不间断地与计数器数值TCNT0进行比较。匹配事件可以用来产生输出比较中断,或者用来在OC0引脚上产生波形。

异步状态寄存器——ASSR如图4.11

图4.11 异步状态寄存器——ASSR

AS0——异步T/C0

AS0为“0”时T/C0由I/O时钟CLKI/O驱动;为“1”时由连接到TOSC1引脚的晶体振荡器驱动。改变AS0有可能破坏TCNT0、OCR0、TCCR0的内容。

PWM波形发生程序

void pwm_test(unsigned char speedx)

{ DDRB|=0XFC; /*B口的6,5,3,2位设置为输出,用于控制电机转向;4

本科毕业设计说明书(论文)

位和7位设置为输出,用于产生PWM波形*/

TCNT0=0x00; /*设置计数初始值*/

第 24 页 共 30 页

OCR0=(unsigned char)speedx*255/5; /*根据速度设置占空比,设小车最大速度为5m/s*/

TCCR0=0b01100010; /*启动计数器,设置为8分频*/ delay_nms(5000); /*延时5m*/

TCCR0=0b01100000; /*关闭计数器,PWM波形停止产生*/

}

4.3.4小车运动距离的控制与实现

由于条件的限制,小车的运动距离控制只能由软件实现。可根据既定速度和距离,算出小车需要运动的时间,运动算定的时间后,令小车停止运动。

程序段如下:

void distence_test(unsigned char speedx,unsigned char distencex) { unsigned int t1;

DDRB|=0XFC; /*B口的6,5,3,2位设置为输出,用于控制电机转向;4位和7位设置为输出,用于产生PWM波形*/

PORTB|=0X48,PORTB&=0XDB; /*使得PB6、PB3置位,PB5、PB2复位(左右轮均运动)*/

TCNT0=0x00; /*设置计数初始值*/

OCR0=(unsigned char)speedx*255/5; /*根据速度设置占空比,设小车最大速度为5m/s*/

TCCR0=0b01100010; /*启动计数器,设置为8分频*/

t1=(unsigned int)1000*distencex/speedx; /*使得t1值强制为unsigned int */ delay_nms(t1); /*延时,让小车运动指定的距离*/ PORTB&=0X93; /*关闭电机驱动电平*/

TCCR0=0b01100000; /*关闭计数器,PWM波形停止产生*/

}

这样的距离控制不是很精确,因为小车的速度除了受电流占空比的影响外还受电机的端电压、运动的环境(比如地面起伏程度,地面光滑程度、风力大小等)