
基于单片机的低频波形发生器:正弦波、方波、三角波等波形输出程序代码及仿真说
明
## 手搓低频波形发生器:从零开始玩转单片机信号源
最近在折腾实验室的旧设备,发现市面上的低频信号源动不动就大几千,寻思着自己用单片机搓个
能打的。这玩意儿做到50kHz以内足够应付大多数电子实验,关键参数还得自己说了算,下面分享实战过程
。
硬件选型直接决定了性能天花板。主控用了STM32F103C8T6,72MHz主频对付50kHz波形绰绰有余。DA
C模块选了DAC8563,16位分辨率能让波形细腻度暴打普通PWM方案。按键矩阵用5向导航开关,LCD1602负
责参数显示——这配置在立创商城50块能搞定。
核心算法藏在定时器中断里。以正弦波生成为例,查表法比实时计算省下大量CPU资源:
```c
#define SIN_TABLE_SIZE 512
uint16_t sin_table[SIN_TABLE_SIZE];
uint32_t phase_accumulator = 0;
uint32_t phase_step = (uint32_t)((1ULL << 32) * 50) / 72000000); //50Hz初始频率
void TIM3_IRQHandler() {
static uint16_t index;
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {
phase_accumulator += phase_step;
index = (phase_accumulator >> 24) & 0x1FF; //取高9位
DAC8563_Write(sin_table[index] * amplitude / 100); //幅度调节
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
```
这里用32位相位累加器实现频率微调,比传统重装定时器的方式精度高出一个量级。查表时取高9
位相当于把波形周期拆成512个点,实测在50kHz时每个点停留时间约390ns,完全满足定时器响应。
波形切换是重头戏,状态机管理让代码保持清爽:
```c
typedef enum {