弘毅 发表于 2014-5-2 22:21:10

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

本帖最后由 董董soul 于 2016-10-27 11:21 编辑

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

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

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

#include <PWM.h>

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

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

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

}

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

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

1573782356 发表于 2015-3-30 10:45:59

弘毅大哥,你好。请问PWM输出引脚的频率能往上调吗?比如频率调到4900HZ

xiaoxiaosaonian 发表于 2015-3-15 19:16:07

弘毅大哥,我设置四路pwm波输出,频率100Hz,代码如下#include <PWM.h>

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

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

void loop()
{
pwmWrite(pwm1, speed1);
pwmWrite(pwm2, speed2);
pwmWrite(pwm3, speed3);
pwmWrite(pwm4, speed4);
delay(30);      
}

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

49741933o 发表于 2015-2-6 22:01:51

本帖最后由 49741933o 于 2015-2-6 22:05 编辑

弘毅大哥,你给的PWM.zip里面没有PWM.CPP文件,编译出错了。。

小小弧 发表于 2014-10-4 08:48:41

怎么么没人顶啊

541板哥 发表于 2014-10-4 15:13:06

真的是好东西,一年前在弘毅大哥的指引下用arduino做了个小东西,当时很是激动:lol,不过没好好研究,现在重拾arduino,好好学学:D

无为 发表于 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/forum.php?mod=viewthread&tid=120&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()需要用到,最好不要修改),有空研究下。非常感谢弘大的无私奉献!

qhp777 发表于 2014-11-19 14:46:35

弘毅大哥,请教个问题#include <PWM.h>怎么加入的?我加入这个怎么编译出错呢

简单侣图 发表于 2015-1-31 16:05:19

请问这个PWM库可以用来做电机调速吗?如何实现:lol

liangquan 发表于 2015-2-27 18:01:42

这么好的帖子,应该有人顶,下载试试

liangquan 发表于 2015-2-27 18:11:28

弘毅大哥,你给的PWM.zip里面没有PWM.CPP文件,编译出错了。。
同问

弘毅 发表于 2015-3-6 09:53:36

liangquan 发表于 2015-2-27 18:11 static/image/common/back.gif
弘毅大哥,你给的PWM.zip里面没有PWM.CPP文件,编译出错了。。
同问

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

xiaoxiaosaonian 发表于 2015-3-15 18:40:59

弘毅大哥,请问怎样可以将pwm波的调节精度调到更小,你的例程里是0-255,我要控制无刷电机,只能在5%-10%的占空比之间调节转速,想让调节精度更细一点。应该怎样做

Klack 发表于 2015-3-15 19:03:00

弘毅大哥顶你多发新帖{:soso_e179:}

xiaoxiaosaonian 发表于 2015-3-17 20:14:36

无为 发表于 2014-11-10 11:05 static/image/common/back.gif
如果我要指定多个引脚的频率怎么设定?需要修改库吗?

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


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

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

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


// for(speed1=28;speed1<34;speed1++)
// {pwmWrite(pwm1, speed1);
// delay(1000);}
speed1=34;
pwmWrite(pwm2, speed2);
pwmWrite(pwm3, speed3);
pwmWrite(pwm4, speed4);
}

void loop()
{
pwmWrite(pwm1, 500);
pwmWrite(pwm2, speed2);
pwmWrite(pwm3, speed3);
pwmWrite(pwm4, speed4);
delay(30);      
}

页: [1] 2 3 4 5
查看完整版本: OCROBOT入门教程027--改变PWM频率