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引脚接入示波器,通过示波器查看输出的波形稳定,频率也是准确的。
弘毅大哥,你好。请问PWM输出引脚的频率能往上调吗?比如频率调到4900HZ 弘毅大哥,我设置四路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:05 编辑
弘毅大哥,你给的PWM.zip里面没有PWM.CPP文件,编译出错了。。 怎么么没人顶啊 真的是好东西,一年前在弘毅大哥的指引下用arduino做了个小东西,当时很是激动:lol,不过没好好研究,现在重拾arduino,好好学学:D 本帖最后由 无为 于 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()需要用到,最好不要修改),有空研究下。非常感谢弘大的无私奉献! 弘毅大哥,请教个问题#include <PWM.h>怎么加入的?我加入这个怎么编译出错呢 请问这个PWM库可以用来做电机调速吗?如何实现:lol 这么好的帖子,应该有人顶,下载试试 弘毅大哥,你给的PWM.zip里面没有PWM.CPP文件,编译出错了。。
同问 liangquan 发表于 2015-2-27 18:11 static/image/common/back.gif
弘毅大哥,你给的PWM.zip里面没有PWM.CPP文件,编译出错了。。
同问
我刚去ocrobot 0002 ide下试了,可以正常编译的。不需要PWM.CPP 弘毅大哥,请问怎样可以将pwm波的调节精度调到更小,你的例程里是0-255,我要控制无刷电机,只能在5%-10%的占空比之间调节转速,想让调节精度更细一点。应该怎样做 弘毅大哥顶你多发新帖{:soso_e179:} 无为 发表于 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);
}