钻石会员
  
主题
帖子
积分11939
阅读权限50
注册时间2012-3-2
最后登录1970-1-1
在线时间 小时
|
本帖最后由 cdhigh 于 2022-7-10 21:45 编辑
AVR+AD9833做信号发生器非常简单,不需要使用标准C编译环境,建议使用Arduino。
有坛友需要,我就简单写一点示范性的代码片段,我电脑上没有Arduino编译环境,没有实际编译,不过如果有编译错误也很简单的就可以修改你看,这种简单的功能用Arduino多方便,不用管什么破寄存器之类的事情,聊聊几十行代码就可以实现一个信号发生器,还带串口控制
#include <stdlib.h>
#include <MD_AD9833.h> //使用AD9833库,非常简单
//如果需要显示屏,可以查阅 U8G2 库
//如果需要按键控制,可以查阅 OneButton 库
//AD9833连接到AVR的管脚
#define DATA PIN_PB0
#define CLK PIN_PB1
#define FSYNC PIN_PB2
MD_AD9833 ad9833(DATA, CLK, FSYNC);
unsigned long frequency;
unsigned int phase;
void setup() {
ad9833.begin(); //初始化AD9833
Serial.begin(38400); //如果需要串口控制,Arduino已经自带串口驱动,直接调用即可
}
void loop() {
unsigned char cmd;
String inStr = "";
//获取串口数据
while (Serial.available()) {
inStr += char(Serial.read());
delay(2);
}
if (inStr.length() == 0) {
return;
}
cmd = inStr.substring(0, 1); //获取命令字
switch (cmd)
{
case 'F': //F+数值,设置频率
frequency = inStr.substring(1).toInt();
ad9833.setFrequency(MD_AD9833::CHAN_0, frequency);
break;
case 'S':
ad9833.setMode(MD_AD9833::MODE_SINE); //设置输出为正弦波
break;
case 'T':
ad9833.setMode(MD_AD9833::MODE_TRIANGLE); //设置输出为三角波
break;
case 'S':
ad9833.setMode(MD_AD9833::MODE_SQUARE1); //设置输出为方波类型1
break;
case 's':
ad9833.setMode(MD_AD9833::MODE_SQUARE2); //设置输出为方波类型2
break;
case 'P': //P+数值,设置相位
phase = inStr.substring(1).toInt();
ad9833.setPhase(MD_AD9833::CHAN_0, phase);
break;
}
Serial.println(inStr); //原样返回字符串
Serial.flush();
}
|
|