第二十九课--Microduino PWM的两种产生方式波形实测/zh

来自Microduino Wikipedia
Pkj讨论 | 贡献2014年8月18日 (一) 15:58的版本
跳转至: 导航搜索

Microduino PWM的两种产生方式波形实测

目的

本教程实测了Microduino PWM输出口的波形。通过analogWrite()函数输出PWM与寄存器直接操作PWM输出波形的对比,帮助读者全面了解Microduino输出PWM的使用方法。

设备

Microduino-Core 是以 Atmel ATmega328P为核心的8位单片机开发核心板,是一个开源的、与 Arduino UNO 兼容的控制器模块。

下载程序模块,可直接与 Microduino-Core 或者Microduino-Core+ 相连,让他们与计算机通讯。它的下载接口用的是MicUSB,这也是Microduino小巧的一部分。Microduino大小与一枚一元硬币差不多大。下载线与绝大多数智能手机usb数据线是一样的,方便实用。

  • 其他硬件设备
相关硬件 数量 功能
20M示波器 1个 测量Microduino PWM输出波形。

示波器

示波器是一种用途十分广泛的电子测量仪器。它能把肉眼看不见的电信号变换成看得见的图象,便于人们研究各种电现象的变化过程。示波器的X轴代表时间,Y轴代表幅值。该示例用到的示波器图像显示采用的是CRT(阴极射线管),属于比较老式的。新型的示波器会采用液晶屏作为显示,体积上要比CRT形式小,功能却有很多增强,例如不用再去数格子,直接会显示周期、频率、幅值等,还会带USB接口,可以很方便的把波形存储于U盘中。

OSC ORG.jpg

实验原理图

Osc real conn.jpg

原理介绍:以前学习MCS-51的时候,知道定时器会溢出,溢出后会置位中断标志,然后可以在中断处理程序或是在主程序中查询来处理。Micrduino-core采用的Atmega328P(TQFP的封装形式),兼容Arduino UNO。这个328芯片对比MCS-51芯片来说,有了很大进步。例如:时钟改进了,复位灵活了,休眠模式可供选择多了,带AD了,带IIC了,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 见下图

PIN 3 9 10 11 0.5ms-div 2V-div.jpg

5 6脚波形基本相同,示波器调节为0.5ms/div 2V/div 见下图

PIN 5 6 0.5ms-div 2V-div.jpg

结论: 3、9、10、11脚的周期为490Hz左右,5、6脚的周期为980Hz左右,幅值均略低于5V。如果改变analogWrite(3,127);中127这个数值,可以在此频率基础上改变占空比。

下面贴出寄存器直接操作PWM的波形图。示波器档位选择为10us/div,2V/div。D10引脚输出。

PIN 10 10us-div 2V-div D=0.25.jpg

再贴张OCR1A=400; OCR1B=200;实测图(10us/div,2V/div)

PIN 10 10us-div 2V-div D=0.5.jpg

结论:改变OCR1A,可轻松改变PWM的频率(周期),改变OCR1B的值可轻松改变在OCR1A设定周期下的占空比。

程序

  • 采用analogWrite()函数:
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
}

调试

  • 把程序复制到Arduino IDE中。
  • 编译程序,选择正确的板卡与相应串口。
  • 点击Upload,下载完毕后观察波形。

结果

该文介绍了Microduino PWM的输出,通过寄存器直接操作PWM的方式可以实现周期与占空比的同时调节。因为更改了定时器相关寄存器的值,可能会影响到Arduino封装好的一些函数,经实测,更改定时器T1相关寄存器的值,并未改变delay(1000)对应1S的延时。在实际应用电路中(例如开关电源电路),可能我们会需要几十K或更高频率的PWM波形,直接操作PWM相关的寄存器可满足需求。

视频