基于51单片机的D/A信号发生器,可产生正弦波、三角波、锯齿波和方波,幅度和频率可调,有软件和硬件控制两套方案,提供原理图、仿真、PCB和资料(包含报告)

最近在实验室折腾了个挺有意思的小玩意儿——基于51单片机的D/A信号发生器。这货不仅能输出正弦波、三角波这些基础波形,连锯齿波和方波都不在话下,关键是还能实时调节幅度频率,简直就是电子实验的神器。今天就把这个项目的核心玩法给大家扒一扒。

先说说硬件架构。核心板用了STC89C52搭配DAC0832这对黄金搭档,DAC0832的电流输出端接了个运算放大器做I/V转换。重点是这个可调增益电路,用了个电位器配合LM358,调节幅度的时候直接拧旋钮就行,实测能调出0-5V的峰峰值。频率调节部分比较有意思,软件方案直接用矩阵键盘输入数值,硬件方案则是外接了个旋转编码器,两种方式都能实时生效。

软件部分的核心在于定时器中断和波形算法。先看这段正弦波生成的代码:

unsigned char code sin_table[256] = {
    128,131,134,...,128  // 预先生成的正弦波表
};

void Timer0_ISR() interrupt 1 {
    static unsigned char index = 0;
    DAC_OUT = sin_table[index++];
    if(index >= 256) index = 0;
    TH0 = (65536 - freq)/256;  // 动态调整频率
    TL0 = (65536 - freq)%256;
}

这里用了查表法生成正弦波,定时器每中断一次就输出一个采样点。频率调节的精髓在于动态修改定时器重装值,实测能稳定输出1Hz到10kHz的波形。不过要注意DAC0832的建立时间,频率太高了波形会失真。

基于51单片机的D/A信号发生器,可产生正弦波、三角波、锯齿波和方波,幅度和频率可调,有软件和硬件控制两套方案,提供原理图、仿真、PCB和资料(包含报告)

方波的实现更有意思,直接上PWM方案:

void set_square_wave(unsigned int duty) {
    P1 = 0xFF;  // 关输出
    TMOD |= 0x01;
    ET0 = 1;
    TR0 = 1;
    duty_cycle = duty;  // 0-100%占空比
}

void Timer0_ISR() interrupt 1 {
    static bit output_state = 0;
    if(output_state) {
        P1 = 0x00;  // 输出高电平
        TH0 = (65536 - (100 - duty_cycle)*period)/256;
    } else {
        P1 = 0xFF;  // 输出低电平
        TH0 = (65536 - duty_cycle*period)/256;
    }
    output_state = !output_state;
}

这里通过动态调整高低电平的持续时间来实现占空比调节,比传统PWM方案更灵活。不过要注意定时器重装值计算时的数据类型转换,搞不好会溢出导致频率跳变。

硬件调试时踩过几个坑:DAC0832的基准电压一定要稳,建议用TL431做个2.5V基准源;运放部分的反馈电阻别用直插的,贴片电阻温漂更小;PCB布局时记得把数字地和模拟地分开,最后在电源端单点连接,不然输出波形会有毛刺。

这个项目最实用的地方在于两套控制方案可以热切换——做实验时用键盘输入参数方便,实际应用时接上编码器旋钮更有操作感。全套资料里那个自动扫频功能也挺有意思,能直观看到滤波器对不同频率的响应。有需要源码和PCB文件的可以直接到我的GitHub仓库扒,记得点个star再走啊~(笑)

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐