极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15664|回复: 6

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

[复制链接]
发表于 2015-10-23 09:00:13 | 显示全部楼层 |阅读模式

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



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

  1. int  n=255;
  2. const int PWMPin=6;

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

  8. void loop()
  9. {
  10.   char  c;

  11.     while (Serial.available() > 0)  
  12.     {
  13.         c=Serial.read();
  14.         if (']'==c)
  15.           {
  16.             n=n+5;
  17.           }
  18.         if ('['==c)
  19.           {
  20.             n=n-5;
  21.           }
  22.        if (n>255) {n=0;}
  23.        if (n<0) {n=255;}   
  24.        analogWrite(PWMPin,n);
  25.        Serial.println(n);

  26.     }
  27. }
复制代码


实验是在 DFRobot 的RoMeoBLE V1.0上
占空比 250 时  250/255=98.039% ,测量值符合

占空比 200  ,200/255=78.431%  65 占空比 25.781%


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

同样,根据【参考2】改一下频率,可以看到当前是  31.36884Hz
  1. int  n=255;
  2. const int PWMPin=9;

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

  9. void loop()
  10. {
  11.   char  c;

  12.     while (Serial.available() > 0)  
  13.     {
  14.         c=Serial.read();
  15.         if (']'==c)
  16.           {
  17.             n=n+5;
  18.           }
  19.         if ('['==c)
  20.           {
  21.             n=n-5;
  22.           }
  23.        if (n>255) {n=0;}
  24.        if (n<0) {n=255;}   
  25.        analogWrite(PWMPin,n);
  26.        Serial.println(n);

  27.     }
  28. }
复制代码

占空比245




参考:
1.        http://www.diyleyuan.com/index.p ... catid=29&id=616
2.        https://arduino-info.wikispaces.com/Arduino-PWM-Frequency
3.        // For Arduino Uno, Nano, Micro Magician, Mini Driver, Lilly Pad and any other board using ATmega 8, 168 or 328**
4.         
5.        //---------------------------------------------- Set PWM frequency for D5 & D6 -------------------------------
6.         
7.        //TCCR0B = TCCR0B & B11111000 | B00000001;    // set timer 0 divisor to     1 for PWM frequency of 62500.00 Hz
8.        //TCCR0B = TCCR0B & B11111000 | B00000010;    // set timer 0 divisor to     8 for PWM frequency of  7812.50 Hz
9.          TCCR0B = TCCR0B & B11111000 | B00000011;    // set timer 0 divisor to    64 for PWM frequency of   976.56 Hz (The DEFAULT)
10.        //TCCR0B = TCCR0B & B11111000 | B00000100;    // set timer 0 divisor to   256 for PWM frequency of   244.14 Hz
11.        //TCCR0B = TCCR0B & B11111000 | B00000101;    // set timer 0 divisor to  1024 for PWM frequency of    61.04 Hz
12.         
13.         
14.        //---------------------------------------------- Set PWM frequency for D9 & D10 ------------------------------
15.         
16.        //TCCR1B = TCCR1B & B11111000 | B00000001;    // set timer 1 divisor to     1 for PWM frequency of 31372.55 Hz
17.        //TCCR1B = TCCR1B & B11111000 | B00000010;    // set timer 1 divisor to     8 for PWM frequency of  3921.16 Hz
18.          TCCR1B = TCCR1B & B11111000 | B00000011;    // set timer 1 divisor to    64 for PWM frequency of   490.20 Hz (The DEFAULT)
19.        //TCCR1B = TCCR1B & B11111000 | B00000100;    // set timer 1 divisor to   256 for PWM frequency of   122.55 Hz
20.        //TCCR1B = TCCR1B & B11111000 | B00000101;    // set timer 1 divisor to  1024 for PWM frequency of    30.64 Hz
21.         
22.        //---------------------------------------------- Set PWM frequency for D3 & D11 ------------------------------
23.         
24.        //TCCR2B = TCCR2B & B11111000 | B00000001;    // set timer 2 divisor to     1 for PWM frequency of 31372.55 Hz
25.        //TCCR2B = TCCR2B & B11111000 | B00000010;    // set timer 2 divisor to     8 for PWM frequency of  3921.16 Hz
26.        //TCCR2B = TCCR2B & B11111000 | B00000011;    // set timer 2 divisor to    32 for PWM frequency of   980.39 Hz
27.          TCCR2B = TCCR2B & B11111000 | B00000100;    // set timer 2 divisor to    64 for PWM frequency of   490.20 Hz (The DEFAULT)
28.        //TCCR2B = TCCR2B & B11111000 | B00000101;    // set timer 2 divisor to   128 for PWM frequency of   245.10 Hz
29.        //TCCR2B = TCCR2B & B11111000 | B00000110;    // set timer 2 divisor to   256 for PWM frequency of   122.55 Hz
30.        //TCCR2B = TCCR2B & B11111000 | B00000111;    // set timer 2 divisor to  1024 for PWM frequency of    30.64 Hz

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  上面文章的翻译

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-10-24 10:27:05 | 显示全部楼层
技术贴啊。很有参考价值
回复 支持 反对

使用道具 举报

发表于 2015-10-24 22:03:12 | 显示全部楼层
不错,学习了
回复 支持 反对

使用道具 举报

发表于 2015-10-25 22:14:53 | 显示全部楼层
虽然看不懂,不过很有学习价值!
回复 支持 反对

使用道具 举报

发表于 2015-10-26 08:09:28 | 显示全部楼层
arduino默认PWM输出频率为1000Hz,可以去网上找PWM库(具体的不记得,百度有的)。最高可以到100KHz。
回复 支持 反对

使用道具 举报

发表于 2015-10-27 07:53:58 | 显示全部楼层
PINKWALKMAN 发表于 2015-10-26 08:09
arduino默认PWM输出频率为1000Hz,可以去网上找PWM库(具体的不记得,百度有的)。最高可以到100KHz。

不是吧,13年侧过一次是1000Hz的。难道记错啦。
回复 支持 反对

使用道具 举报

发表于 2015-10-31 10:59:00 | 显示全部楼层
不错,学习了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 03:40 , Processed in 0.041266 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表