标题: 用arduino作为方波发生器,非常精准,频率任意可调 [打印本页]

作者: a362880    时间: 2018-10-19 23:40
标题: 用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方波的图形,非常精准


作者: 252622979    时间: 2018-10-23 10:53
还不太明白
作者: aing123    时间: 2018-10-25 19:26
不明白!

作者: 都市郎    时间: 2019-2-14 20:56
自娱自乐,自说自话吧!
作者: gyy4606    时间: 2019-3-2 09:50
不明白! void loop()这里什么也没有,怎么会有方波输出?
作者: 疏雨妆臣    时间: 2019-12-4 15:00
用pro mini试的。还可以。学习了

2019-12-04_14.57.56.jpg (1.24 MB, 下载次数: 163)

2019-12-04_14.57.56.jpg

2019-12-04_14.58.26.jpg (1.77 MB, 下载次数: 180)

2019-12-04_14.58.26.jpg

2019-12-04_14.59.41.jpg (1.63 MB, 下载次数: 167)

2019-12-04_14.59.41.jpg

作者: 难得糊涂2018    时间: 2019-12-7 18:19
占空比也可调才好
作者: 第五个季节    时间: 2020-3-29 23:10
直接操作寄存器?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1