“第二十九课--Microduino PWM的两种产生方式波形实测/zh”的版本间的差异
(Created page with "Microduino PWM的两种产生方式波形实测 {| style="width: 800px;" |- | ==目的== 本教程实测了Microduino PWM输出口的波形。通过analogWrite()函数输出P...") |
(没有差异)
|
2014年8月18日 (一) 15:31的版本
Microduino PWM的两种产生方式波形实测
目的本教程实测了Microduino PWM输出口的波形。通过analogWrite()函数输出PWM与寄存器直接操作PWM输出波形的对比,帮助读者全面了解Microduino输出PWM的使用方法。 设备Microduino-Core 是以 Atmel ATmega328P为核心的8位单片机开发核心板,是一个开源的、与 Arduino UNO 兼容的控制器模块。 下载程序模块,可直接与 Microduino-Core 或者Microduino-Core+ 相连,让他们与计算机通讯。它的下载接口用的是MicUSB,这也是Microduino小巧的一部分。Microduino大小与一枚一元硬币差不多大。下载线与绝大多数智能手机usb数据线是一样的,方便实用。
示波器示波器是一种用途十分广泛的电子测量仪器。它能把肉眼看不见的电信号变换成看得见的图象,便于人们研究各种电现象的变化过程。示波器的X轴代表时间,Y轴代表幅值。该示例用到的示波器图像显示采用的是CRT(阴极射线管),属于比较老式的。新型的示波器会采用液晶屏作为显示,体积上要比CRT形式小,功能却有很多增强,例如不用再去数格子,直接会显示周期、频率、幅值等,还会带USB接口,可以很方便的把波形存储于U盘中。 实验原理图原理介绍:以前学习MCS-51的时候,知道定时器会溢出,溢出后会置位中断标志,然后可以在中断处理程序或是在主程序中查询来处理。Micrduino-core采用的Atmega328P(TQFP的封装形式),兼容Arduino UNO。这个328芯片对比MCS-51芯片来说,有了很大进步。例如:时钟改进了,复位灵活了,休眠模式可供选择多了,IO口也不一样了……。自然,Atmel的工程师不会放过定时器。328的定时器对比MCS-51灵活了很多,增添了预分频器,增添了输出比较寄存器,增加了直接输出PWM的能力。利用PWM我们可以调节LED灯的亮度,可以改变直流电机的转速。在Arduino IDE开发环境下,analogWrite函数可以改变占空比(占空比的概念是一个周期内高电平的时间除以一个周期的时间),但是analogWrite函数不能改变PWM的频率。可以实现Microduino的PWM频率与占空比都可调吗?答案是可以。先简介下定时器与预分频器相关知识。 328有三个定时器。定时器0与定时器2均是8位定时器,定时器1是16位定时器。Microduino的PWM输出脚D5(对应于OC0A)与D6(OC0B)对应于定时器0,D3(OC2B)与D11(OC2A)对应于定时器2,D9(OC1A)与D10(OC1B)对应于定时器1。 预分频器:预分频器是个好东西。它可以把16MHz的晶振频率分频后给定时器用,如果预分频器的值设置为8,那么定时器获得的时钟频率就相当于是2MHz了,如果分频器设置为1024,那么定时器获取的时钟频率就相当于16000000/1024=15.625KHz。通过预分频器的设置,定时器可以定时的时间就延长了,或者说定时时间更灵活了,因为定时器时钟慢了,同样计到256个数或是计到65536个数的时间就延长了。举例说明,对于定时器T0而言,如果没有用到预分频器,那么T0工作的最低频率等于16000000/256=62.5K,周期T=1/f=1/62.5K=16uS , 显然,对于一些实际应用而言,定时时间有些短了,如果TO用于PWM输出,62.5K的频率可能也有些高了。 下面用Microduino-Core实测analogWrite()函数波形。 3 9 10 11 脚波形基本相同,示波器调节为0.5ms/div 2V/div 见下图 5 6脚波形基本相同,示波器调节为0.5ms/div 2V/div 见下图 结论 3、9、10、11脚的周期为490Hz左右,5、6脚的周期为980Hz左右幅值均略低于5V。如果改变analogWrite(3,127);中127这个数值,可以在此频率基础上改变占空比。 下面贴出寄存器直接操作PWM的波形图。D10引脚输出。改变OCR1A,可轻松改变PWM的频率(周期),改变OCR1B的值可轻松改变在OCR1A设定周期下的占空比。
程序
void setup()
{
pinMode(3,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
}
void loop()
{
analogWrite(3,127);
analogWrite(5,127);
analogWrite(6,127);
analogWrite(9,127);
analogWrite(10,127);
analogWrite(11,127);
}
void setup()
{
pinMode(10,OUTPUT);
}
void loop()
{
TCCR1A =_BV(COM1A0) | _BV(COM1B1) | _BV(WGM11) | _BV(WGM10);
TCCR1B =_BV(WGM12) |_BV(WGM13) | _BV(CS10);
// _BV(COM1A0) equal COM1A0=1,the bit COM1A0 is in the TCCR1A register byte。
//COM1A0=1; COM1B1=1;enable and choose the normal output,not invert output 。
// WGM11=1; WGM10=1; WGM12=1; WGM13=1; choose the fast PWM,the top value is OCR1A。OC1B (D10)is the only output pin
// CS10=1; no prescaling
OCR1A=400;//change this value can set the frequency F=16000000/400=40KHz
OCR1B=100;//change this value can set the duty cycle Duty=OCR1B/OCR1A
}
调试
结果该文介绍了Microduino PWM的输出,通过寄存器直接操作PWM的方式可以实现周期与占空比的同时调节。因为更改了定时器相关寄存器的值,可能会影响到Arduino封装好的一些函数,经实测,更改定时器T1相关寄存器的值,并未改变delay(1000)对应1S的延时。在实际应用电路中(例如开关电源电路),可能我们会需要几十K或更高频率的PWM波形,直接操作PWM相关的寄存器可满足需求。 视频 |