|
首先需要知道的是:不是所有的Pin都可以用来输出PWM,根据【参考1】,在Uno上的 3 5 6 9 10 和11才可以用来输出PWM.
编写一个简单的程序来调整占空比
- 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% ,测量值符合
占空比 200 ,200/255=78.431% 65 占空比 25.781%
占空比为0 时是一条低电平的直线
占空比255是一条高电平的直线。
不过特别注意到测量出来的频率是976.5Hz, 我更换了一个普通的UNO 结果还是 976HZ。这和很多资料中提到的 490Hz不同,经过研究,在【参考2】上找到了介绍,原来 D5 D6 的默认频率和其他的不同。换成 Pin6 修改上面的程序,看到的就是 490Hz了。
同样,根据【参考2】改一下频率,可以看到当前是 31.36884Hz - 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
参考:
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
|