wjlht 发表于 2015-3-14 14:10:58

用arduino作为方波发生器,非常精准,频率任意可调

最近研究了arduino的定时器,可以用pwm作为方波发生器,在9脚上输出方波。代码如下:
void setup()
{
// 下面的等值于 OC1A = 输出用于定时器1的CTC模式
pinMode(9, OUTPUT);// 设置默认关联了D9(查表得知)为输出
TCCR1B=0; // 只是个复位的习惯可以不要
TCCR1A=_BV(COM1A0); // 要是困扰的话你也可以写成 TCCR1A = 0b01000000;
//这里和上一个表示了 = CTC 模式, 开启比较器(默认输出), prescaler = 1
TCCR1B = _BV(WGM12)|_BV(CS10) ; //这里等值于 TCCR1B = 0b00001001;

// 最有意思的了,16位的玩意来确定要一个怎样的频率
OCR1A = 0; // 计算为:F_CPU/2/Need_HZ-1 来得到你想要的,遗憾的是四舍五入来截取频率

}

void loop(){
//这次啥也没做
}

通过设置OCR1A来改变频率大小,例子上输出方波频率为8M,够高吧!由于OCR1A是16为寄存器,最大也只能设为65535,故频率最低可达到122HZ,arduino晶振为16M,因此这个例子能输出的频率范围为f/(2*65536)到f/2, 其中f为arduino时钟频率,即16M

下面是生成8M方波的图形,非常精准

hsr18299 发表于 2015-3-14 14:44:48

http://code.google.com/p/arduino-pwm-frequency-library/downloads/list

amxamx 发表于 2015-3-14 16:20:54

能用Arduino MEGA2560发出频率为47.21Hz,幅值为3.3V,占空比为1-10%之间的pwm波?

wjlht 发表于 2015-3-14 19:17:03

amxamx 发表于 2015-3-14 16:20 static/image/common/back.gif
能用Arduino MEGA2560发出频率为47.21Hz,幅值为3.3V,占空比为1-10%之间的pwm波?

这很容易实现呀,用delay()函数,设置引脚高电平和低电平,就可轻松实现,频率越低越容易实现,高频率的方波就需要用定时器了,不占用cpu

amxamx 发表于 2015-3-15 09:52:14

wjlht 发表于 2015-3-14 19:17 static/image/common/back.gif
这很容易实现呀,用delay()函数,设置引脚高电平和低电平,就可轻松实现,频率越低越容易实现,高频率的 ...

高电平不是默认5V了?幅值3.3V怎么设置啊?
   我用delay函数算了时间,正脉宽对,负脉宽不对了。。

xiaoxiaosaonian 发表于 2015-3-15 13:26:46

楼主如果要改变pwm的占空比应该怎么做

wsy0315 发表于 2015-3-16 14:58:05

xiaoxiaosaonian 发表于 2015-3-15 13:26 static/image/common/back.gif
楼主如果要改变pwm的占空比应该怎么做

这个我不是很明白,
digitalWrite(led,HIGH)
delay(X)
digitalWrite(led,LOW)
delay(Y)
只知道改变X,Y就能改变占空比,x=y就是50%,至于频率就不用我说了吧?

xiaoxiaosaonian 发表于 2015-3-16 20:19:53

wsy0315 发表于 2015-3-16 14:58 static/image/common/back.gif
这个我不是很明白,
digitalWrite(led,HIGH)
delay(X)


这个我知道,置高置低,我想用的是用定时器1和2写pwm,用3,9,10,11引脚输出这个

Karl 发表于 2015-3-17 23:32:35

楼主用的什么软件的呀?:)

bigwolf 发表于 2015-3-18 08:11:06

hsr18299 发表于 2015-3-14 14:44 static/image/common/back.gif
http://code.google.com/p/arduino-pwm-frequency-library/downloads/list

老大,google上不去啊

wjlht 发表于 2015-3-19 22:54:15

Karl 发表于 2015-3-17 23:32 static/image/common/back.gif
楼主用的什么软件的呀?

用逻辑测试仪测的引脚

wsy0315 发表于 2015-3-29 19:39:45

xiaoxiaosaonian 发表于 2015-3-16 20:19 static/image/common/back.gif
这个我知道,置高置低,我想用的是用定时器1和2写pwm,用3,9,10,11引脚输出这个

不是很明白你的问题,delay不就算是定时了吗?

bestweihua 发表于 2016-7-26 11:26:46

感谢楼主分享,请问要是想改变所产生的脉冲的占空比的话该怎么做

jg521000 发表于 2016-7-26 12:14:48

本帖最后由 jg521000 于 2016-7-26 13:44 编辑

楼主,我查了一下ATMEGA32U4芯片的资料, WGM2=1 WGM1=0,WGM0=0的时候,是保留模式??为何可以产生方波呢?
谢谢

文少 发表于 2016-12-21 02:44:59

楼主的代码如果用于MEGA2560则输出脚是11~~

页: [1] 2
查看完整版本: 用arduino作为方波发生器,非常精准,频率任意可调