DAC 功能:
数模转换器,将数字量 (0-4095) 转换为模拟电压 (0-3.3V)
输出方式:电压输出 (通过内部运放)
STM32 DAC 特性:
12 位分辨率,输出电压 = 数字值 × 3.3V / 4096
单 / 双通道 (如 DAC1 和 DAC2)
触发方式:软件触发、定时器触发
输出缓存 (提高驱动能力)
DAC 配置步骤:
使能 DAC 和 GPIO 时钟
配置 GPIO 为模拟输出 (如 PA4)
配置 DAC 参数 (分辨率、触发方式)
使能 DAC
设置输出值
代码示例:(DAC 输出正弦波)
// 正弦波表(8位精度,0-255)
const uint8_t sin_table[256] = {
128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173,
176, 179, 182, 185, 188, 191, 194, 197, 200, 203, 205, 208, 211, 213, 216, 218,
... // 省略部分数据
};
// DAC初始化
DAC_HandleTypeDef hdac1;
void DAC1_Init(void){
GPIO_InitTypeDef GPIO_InitStruct;
// 使能GPIOA和DAC1时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_DAC_CLK_ENABLE();
// 配置PA4为模拟输出
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置DAC参数
hdac1.Instance = DAC1;
hdac1.Init.OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; // 使能输出缓冲
HAL_DAC_Init(&hdac1);
HAL_DAC_Start(&hdac1); // 启动DAC
}
// 主函数
int main(){
DAC1_Init();
uint16_t dac_value;
while(1){
for(int i=0; i<256; i++){
// 转换为12位(0-4095)
dac_value = (uint16_t)sin_table[i] * 16; // 8位→12位
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dac_value); // 设置输出值
HAL_Delay(10); // 控制波形频率
}
}
}
85

被折叠的 条评论
为什么被折叠?



