引入SPI库
#include
定义MCP4921 DAC输出引脚 #define DAC_CS PB3 #define DAC_LD PD7 #define DAC_VREF 3.3
初始化SPI和DAC void spi_init(void) { SPI.begin(); SPI.setBitOrder(MSBFIRST); SPI.setDataMode(SPI_MODE0); SPI.setClockDivider(SPI_CLOCK_DIV4); } void dac_init(void) { DDRB |= (1 << DAC_CS); DDRD |= (1 << DAC_LD); PORTB |= (1 << DAC_CS); // 拉高片选 PORTD |= (1 << DAC_LD); // 拉高LDAC }
写入自定义正弦波函数 void write_sinewave(float frequency) { const float MAX_ANGLE = 2.0 * M_PI; const float MIN_FREQUENCY = 0.1; const uint16_t N_SAMPLES = 256; const float SAMPLE_PERIOD = 1.0 / 1000.0; const float AMPLITUDE = 0.5 * DAC_VREF;
if (frequency < MIN_FREQUENCY) { return; }
float phase_increment = frequency * MAX_ANGLE / (1.0 / SAMPLE_PERIOD);
float sin_table[N_SAMPLES];
for (uint16_t i = 0; i < N_SAMPLES; i++) { sin_table[i] = AMPLITUDE * sin(i * phase_increment); }
PORTD &= ~(1 << DAC_LD); // 允许LDAC PORTB &= ~(1 << DAC_CS); // 使能DAC
for (uint16_t i = 0; i < N_SAMPLES; i++) { uint16_t value = (uint16_t) ((sin_table[i] / DAC_VREF) * 4095.0); value |= (1 << 15); //设置更新输出 SPI.transfer16(value); }
PORTB |= (1 << DAC_CS); PORTD |= (1 << DAC_LD); // 禁止LDAC }
调用函数输出正弦波 int main(void) { spi_init(); dac_init();
while (1) { write_sinewave(100); // 100Hz _delay_ms(1000); write_sinewave(200); // 200Hz