用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方波的图形,非常精准
http://code.google.com/p/arduino-pwm-frequency-library/downloads/list 能用Arduino MEGA2560发出频率为47.21Hz,幅值为3.3V,占空比为1-10%之间的pwm波? amxamx 发表于 2015-3-14 16:20 static/image/common/back.gif
能用Arduino MEGA2560发出频率为47.21Hz,幅值为3.3V,占空比为1-10%之间的pwm波?
这很容易实现呀,用delay()函数,设置引脚高电平和低电平,就可轻松实现,频率越低越容易实现,高频率的方波就需要用定时器了,不占用cpu wjlht 发表于 2015-3-14 19:17 static/image/common/back.gif
这很容易实现呀,用delay()函数,设置引脚高电平和低电平,就可轻松实现,频率越低越容易实现,高频率的 ...
高电平不是默认5V了?幅值3.3V怎么设置啊?
我用delay函数算了时间,正脉宽对,负脉宽不对了。。 楼主如果要改变pwm的占空比应该怎么做 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%,至于频率就不用我说了吧? wsy0315 发表于 2015-3-16 14:58 static/image/common/back.gif
这个我不是很明白,
digitalWrite(led,HIGH)
delay(X)
这个我知道,置高置低,我想用的是用定时器1和2写pwm,用3,9,10,11引脚输出这个 楼主用的什么软件的呀?:) hsr18299 发表于 2015-3-14 14:44 static/image/common/back.gif
http://code.google.com/p/arduino-pwm-frequency-library/downloads/list
老大,google上不去啊 Karl 发表于 2015-3-17 23:32 static/image/common/back.gif
楼主用的什么软件的呀?
用逻辑测试仪测的引脚 xiaoxiaosaonian 发表于 2015-3-16 20:19 static/image/common/back.gif
这个我知道,置高置低,我想用的是用定时器1和2写pwm,用3,9,10,11引脚输出这个
不是很明白你的问题,delay不就算是定时了吗? 感谢楼主分享,请问要是想改变所产生的脉冲的占空比的话该怎么做 本帖最后由 jg521000 于 2016-7-26 13:44 编辑
楼主,我查了一下ATMEGA32U4芯片的资料, WGM2=1 WGM1=0,WGM0=0的时候,是保留模式??为何可以产生方波呢?
谢谢 楼主的代码如果用于MEGA2560则输出脚是11~~
页:
[1]
2