一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 430|回复: 0
收起左侧

[avr] AVR+AD9833做信号发生器的代码片段

[复制链接]
发表于 2022-7-10 21:39 | 显示全部楼层 |阅读模式
本帖最后由 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();
}




本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-28 15:09 , Processed in 0.063096 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表