用示波器“看” arduino (3) — PWM

Arduino 上面有模拟到数字(ADC)的采样功能但是没有数字到模拟的输出(DAC),在要求不是特别高的情况下 PWM 充当这一角色。

首先需要知道的是:不是所有的Pin都可以用来输出PWM,根据【参考1】,在Uno上的 3 5 6 9 10 和11才可以用来输出PWM.

image001

编写一个简单的程序来调整占空比

int  n=255;
const int PWMPin=6;

void setup()
{
    Serial.begin(9600);
    pinMode(PWMPin,OUTPUT);      //该端口需要选择有#号标识的数字口
}

void loop()
{
  char  c;

    while (Serial.available() > 0)  
    {
        c=Serial.read();
        if (']'==c) 
          {
            n=n+5;
          }
        if ('['==c) 
          {
            n=n-5;
          }
       if (n>255) {n=0;}
       if (n<0) {n=255;}   
       analogWrite(PWMPin,n); 
       Serial.println(n);

    }
}

我们使用 DFRobot 出品的 RoMeoBLE V1.0 作为实验器材。

占空比 250 时 , 250/255=98.039% ,测量值符合预期

image006

占空比 200 时 ,200/255=78.431% ,测量值符合预期

image003

占空比为0 时是一条低电平的直线,占空比255是一条高电平的直线,这里就不贴上来了。

不过特别注意到测量出来的频率是976.5Hz, 我更换了一个普通的UNO 结果还是 976HZ。这和很多资料中提到的 490Hz不同,经过研究,在【参考2】上找到了介绍,原来 D5 D6 的默认频率和其他的不同。换成 Pin6 修改上面的程序,看到的就是 490Hz了。

image004

同样,根据【参考2】改一下频率,可以看到当前是 31.36884 KHz

int  n=255;
const int PWMPin=9;

void setup()
{
    Serial.begin(9600);
    TCCR1B = TCCR1B & B11111000 | B00000001;    // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz    
    pinMode(PWMPin,OUTPUT);      //该端口需要选择有#号标识的数字口
}

void loop()
{
  char  c;

    while (Serial.available() > 0)  
    {
        c=Serial.read();
        if (']'==c) 
          {
            n=n+5;
          }
        if ('['==c) 
          {
            n=n-5;
          }
       if (n>255) {n=0;}
       if (n<0) {n=255;}   
       analogWrite(PWMPin,n); 
       Serial.println(n);

    }
}

调整占空比为 245 时的样子

image005

放大一点看看具体波形

image006

参考:
1. http://www.diyleyuan.com/index.php?m=content&c=index&a=show&catid=29&id=616
2. https://arduino-info.wikispaces.com/Arduino-PWM-Frequency
pwma
3. http://playground.arduino.cc/Code/PwmFrequency 关于调整频率官方的介绍
4. https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM Secrets of Arduino PWM
http://www.diy-robots.com/?p=852 上面文章的翻译
http://www.diy-robots.com/?p=814 上面文章的翻译

发表评论

电子邮件地址不会被公开。 必填项已用*标注