技术分享】基于51单片机的D A信号发生器,支持正弦波、三角波、锯齿波和方波,幅度频率可调,软...
重点是这个可调增益电路,用了个电位器配合LM358,调节幅度的时候直接拧旋钮就行,实测能调出0-5V的峰峰值。频率调节的精髓在于动态修改定时器重装值,实测能稳定输出1Hz到10kHz的波形。基于51单片机的D/A信号发生器,可产生正弦波、三角波、锯齿波和方波,幅度和频率可调,有软件和硬件控制两套方案,提供原理图、仿真、PCB和资料(包含报告)基于51单片机的D/A信号发生器,可产生正弦波、三角波、
基于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再走啊~(笑)

更多推荐



所有评论(0)