| 
钻石会员 主题
回帖0
积分12461
阅读权限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();
 }
 
 
 
 
 
 | 
 |