极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26081|回复: 62

OCROBOT入门教程027--改变PWM频率

[复制链接]
发表于 2014-5-2 22:21:10 | 显示全部楼层 |阅读模式
本帖最后由 董董soul 于 2016-10-27 11:21 编辑

我们使用analogWrite()命令输出的PWM频率默认为490Hz左右,在大部分场合这个默认频率可以直接使用,但是如果用来驱动电调等地方需要输出一个特定频率的方波,这时我们就需要改变PWM频率。

这节课我们学一下怎样使用PWM库来改变PWM输出引脚的频率。

我们使用D9来输出一个100Hz的方波,下面是驱动代码:


  1. #include <PWM.h>

  2. int led = 9;                // led所连接到的引脚
  3. int brightness = 100;         // led的亮度,也就是占空比,范围是0-255
  4. int32_t frequency = 100; // 频率 (单位是Hz)

  5. void setup()
  6. {
  7.   // 初始化除了0号计时器以外的其他计时器
  8.   InitTimersSafe();

  9.   // 设置指定引脚的频率
  10.   bool success = SetPinFrequencySafe(led, frequency);
  11.   
  12. }

  13. void loop()
  14. {
  15.   pwmWrite(led, brightness);
  16.   delay(30);      
  17. }
复制代码

我们把D9引脚接入示波器,通过示波器查看输出的波形稳定,频率也是准确的。

100Hz的PWM.jpg

PWM.zip

14.53 KB, 下载次数: 1669

回复

使用道具 举报

发表于 2015-3-15 19:16:07 | 显示全部楼层
弘毅大哥,我设置四路pwm波输出,频率100Hz,代码如下
  1. #include <PWM.h>

  2. int pwm1 = 9;  // led所连接到的引脚
  3. int pwm2 = 10;
  4. int pwm3 = 11;
  5. int pwm4 = 3;
  6. int speed1 = 33;         // led的亮度,也就是占空比,范围是0-255
  7. int speed2 = 33;
  8. int speed3 = 33;
  9. int speed4 = 33;
  10. int32_t frequency = 100; // 频率 (单位是Hz)

  11. void setup()
  12. {
  13. // 初始化除了0号计时器以外的其他计时器
  14. InitTimersSafe();
  15. // 设置指定引脚的频率
  16. bool success1 = SetPinFrequencySafe(pwm1, frequency);
  17. bool success2 = SetPinFrequencySafe(pwm2, frequency);
  18. bool success3 = SetPinFrequencySafe(pwm3, frequency);
  19. bool success4 = SetPinFrequencySafe(pwm4, frequency);
  20. }

  21. void loop()
  22. {
  23. pwmWrite(pwm1, speed1);
  24. pwmWrite(pwm2, speed2);
  25. pwmWrite(pwm3, speed3);
  26. pwmWrite(pwm4, speed4);
  27. delay(30);      
  28. }

复制代码
但是第三路11号引脚没有pwm波输出,其他三路pwm波都是正确的,这个是代码的问题还是什么原因,请弘毅大哥知道一下
回复 支持 1 反对 0

使用道具 举报

发表于 2015-2-6 22:01:51 | 显示全部楼层
本帖最后由 49741933o 于 2015-2-6 22:05 编辑

弘毅大哥,你给的PWM.zip  里面没有PWM.CPP文件,编译出错了。。
回复 支持 1 反对 0

使用道具 举报

发表于 2014-10-4 08:48:41 | 显示全部楼层
怎么么没人顶啊
回复 支持 反对

使用道具 举报

发表于 2014-10-4 15:13:06 | 显示全部楼层
真的是好东西,一年前在弘毅大哥的指引下用arduino做了个小东西,当时很是激动,不过没好好研究,现在重拾arduino,好好学学
回复 支持 反对

使用道具 举报

发表于 2014-11-10 11:05:21 | 显示全部楼层
本帖最后由 无为 于 2014-11-10 15:51 编辑

如果我要指定多个引脚的频率怎么设定?需要修改库吗?

最近实验了下,可以同时控制两个引脚的PWM的值
如:
#include <PWM.h>

int led = 9;                // led所连接到的引脚
int led2 = 10;          // led所连接到的引脚
int brightness = 250;         // led的亮度,也就是占空比,范围是0-255
int brightness2 = 10;          // led2的亮度,也就是占空比,范围是0-255
int32_t frequency = 100; // 频率 (单位是Hz)

void setup()
{
  // 初始化除了0号计时器以外的其他计时器
  InitTimersSafe();

  // 设置指定引脚的频率
  bool success = SetPinFrequencySafe(led, frequency);

}

void loop()
{
  pwmWrite(led, brightness);
pwmWrite(led2, brightness2);
  delay(30);      
}

查看了原来的一些帖子:http://www.geek-workshop.com/for ... 0&highlight=PWM
原来9,10脚对应的是TIMER1
时钟输出 | Arduino输出Pin编号 | 芯片Pin | Pin name
OC0A          6                               12             PD6
OC0B           5                              11              PD5
OC1A          9                               15              PB1
OC1B         10                              16              PB2
OC2A         11                              17              PB3
OC2B         3                                5                PD3
看来弘大的库是修改了TIMER1的参数来达到修改输出频率的方式,不知道此库对TIMER2是否也可以修改(TIMER0因delay()需要用到,最好不要修改),有空研究下。非常感谢弘大的无私奉献!
回复 支持 反对

使用道具 举报

发表于 2014-11-19 14:46:35 | 显示全部楼层
弘毅大哥,请教个问题#include <PWM.h>怎么加入的?我加入这个怎么编译出错呢
回复 支持 反对

使用道具 举报

发表于 2015-1-31 16:05:19 | 显示全部楼层
请问这个PWM库可以用来做电机调速吗?如何实现
回复 支持 反对

使用道具 举报

发表于 2015-2-27 18:01:42 | 显示全部楼层
这么好的帖子,应该有人顶,下载试试
回复 支持 反对

使用道具 举报

发表于 2015-2-27 18:11:28 | 显示全部楼层
弘毅大哥,你给的PWM.zip  里面没有PWM.CPP文件,编译出错了。。
同问
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-6 09:53:36 | 显示全部楼层
liangquan 发表于 2015-2-27 18:11
弘毅大哥,你给的PWM.zip  里面没有PWM.CPP文件,编译出错了。。
同问

我刚去ocrobot 0002 ide下试了,可以正常编译的。不需要PWM.CPP
回复 支持 反对

使用道具 举报

发表于 2015-3-15 18:40:59 | 显示全部楼层
弘毅大哥,请问怎样可以将pwm波的调节精度调到更小,你的例程里是0-255,我要控制无刷电机,只能在5%-10%的占空比之间调节转速,想让调节精度更细一点。应该怎样做
回复 支持 反对

使用道具 举报

发表于 2015-3-15 19:03:00 | 显示全部楼层
弘毅大哥  顶你  多发新帖  {:soso_e179:}
回复 支持 反对

使用道具 举报

发表于 2015-3-17 20:14:36 | 显示全部楼层
无为 发表于 2014-11-10 11:05
如果我要指定多个引脚的频率怎么设定?需要修改库吗?

最近实验了下,可以同时控制两个引脚的PWM的值

你好,不知道你是否将timer2的pwm波输出搞定了了,我也是用的弘毅大哥的pwm库,要输出4路pwm波,发现timer2A控制的11脚没有输出,timer2B的3脚有,查看库文件里面发现pwmwrite函数里面没有写timer2A,但是加上去之后A、B都没有输出了,然后pwmwriteHR函数timer2也是没有输出的,代码如下,求大神知道
  1. #include <PWM.h>

  2. int pwm1 = 9;  // led所连接到的引脚
  3. int pwm2 = 10;
  4. int pwm3 = 3;
  5. int pwm4 = 11;
  6. int speed1 = 28;         // led的亮度,也就是占空比,范围是0-255
  7. int speed2 = 38;
  8. int speed3 = 28;
  9. int speed4 = 36;
  10. int32_t frequency = 100; // 频率 (单位是Hz)

  11. void setup()
  12. {
  13.   //delay(2000);
  14. // 初始化除了0号计时器以外的其他计时器
  15. InitTimersSafe();
  16. // 设置指定引脚的频率
  17. bool success1 = SetPinFrequencySafe(pwm1, frequency);
  18. bool success2 = SetPinFrequencySafe(pwm2, frequency);
  19. bool success3 = SetPinFrequencySafe(pwm3, frequency);
  20. bool success4 = SetPinFrequencySafe(pwm4, frequency);


  21. // for(speed1=28;speed1<34;speed1++)
  22. // {pwmWrite(pwm1, speed1);
  23. // delay(1000);}
  24. speed1=34;
  25. pwmWrite(pwm2, speed2);
  26. pwmWrite(pwm3, speed3);
  27. pwmWrite(pwm4, speed4);
  28. }

  29. void loop()
  30. {
  31. pwmWrite(pwm1, 500);
  32. pwmWrite(pwm2, speed2);
  33. pwmWrite(pwm3, speed3);
  34. pwmWrite(pwm4, speed4);
  35. delay(30);      
  36. }

复制代码
回复 支持 反对

使用道具 举报

发表于 2015-3-30 10:45:59 | 显示全部楼层
弘毅大哥,你好。请问PWM输出引脚的频率能往上调吗?比如频率调到4900HZ
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2019-7-16 23:14 , Processed in 0.060732 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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