前期准备
软件平台:基于KEIL的HAL库开发 硬件平台:正点原子STM32F4探索者开发板
STM32F4 DAC 简介
STM32F4 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的 DAC。DAC 可以配置为 8 位或 12 位模式,也可以与 DMA 控制器配合使用。DAC 工作在 12 位模式时, 数据可以设置成左对齐或右对齐。DAC 模块有 2 个输出通道,每个通道都有单独的转换器。 在双 DAC 模式下,2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个 通道的输出。DAC 可以通过引脚输入参考电压 Vref+(通 ADC 共用)以获得更精确的转换 结果。 STM32F4 的 DAC 模块主要特点有: ① 2 个 DAC 转换器:每个转换器对应 1 个输出通道 ② 8 位或者 12 位单调输出 ③ 12 位模式下数据左对齐或者右对齐 ④ 同步更新功能 ⑤ 噪声波形生成 ⑥ 三角波形生成 ⑦ 双 DAC 通道同时或者分别转换 ⑧ 每个通道都有 DMA 功能 图中 VDDA 和 VSSA 为 DAC 模块模拟部分的供电,而 Vref+则是 DAC 模块的参考电 压。DAC_OUTx 就是 DAC 的输出通道了(对应 PA4 或者 PA5 引脚)。
相关寄存器
代码配置
DAC配置
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_DAC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_Initure.Pin=GPIO_PIN_5 | GPIO_PIN_4;
GPIO_Initure.Mode=GPIO_MODE_ANALOG;
GPIO_Initure.Pull=GPIO_NOPULL;
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}
DAC_HandleTypeDef DAC_Handler;
void DAC1_Init(void)
{
DAC_ChannelConfTypeDef DAC_Config;
DAC_Handler.Instance=DAC;
DAC_Config.DAC_Trigger=DAC_TRIGGER_T5_TRGO;
HAL_DAC_Init(&DAC_Handler);
HAL_DAC_ConfigChannel(&DAC_Handler,&DAC_Config,DAC_CHANNEL_2);
DAC_Config.DAC_Trigger=DAC_TRIGGER_T7_TRGO;
HAL_DAC_ConfigChannel(&DAC_Handler,&DAC_Config,DAC_CHANNEL_1);
HAL_DACEx_NoiseWaveGenerate(&DAC_Handler,DAC_CHANNEL_2,DAC_LFSRUNMASK_BITS11_0 );
HAL_DACEx_NoiseWaveGenerate(&DAC_Handler,DAC_CHANNEL_1,DAC_LFSRUNMASK_BITS11_0 );
HAL_DAC_Start(&DAC_Handler,DAC_CHANNEL_2);
HAL_DAC_Start(&DAC_Handler,DAC_CHANNEL_1);
HAL_DACEx_DualSetValue(&DAC_Handler,DAC_ALIGN_12B_R,0,0);
}
定时器配置:这里可以通过调节定时器自动重装载值和分频系数调整频率大小
TIM_HandleTypeDef TIM5_Handler;
void TIM5_Init(void)
{
TIM_MasterConfigTypeDef TIM5_Master;
TIM5_Handler.Instance=TIM5;
TIM5_Handler.Init.Prescaler=1;
TIM5_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;
TIM5_Handler.Init.Period=1;
TIM5_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&TIM5_Handler);
TIM5_Master.MasterOutputTrigger = TIM_TRGO_UPDATE;
TIM5_Master.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&TIM5_Handler,&TIM5_Master);
HAL_TIM_Base_Start(&TIM5_Handler);
}
TIM_HandleTypeDef TIM7_Handler;
void TIM7_Init(void)
{
TIM_MasterConfigTypeDef TIM7_Master;
TIM7_Handler.Instance=TIM7;
TIM7_Handler.Init.Prescaler=1;
TIM7_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;
TIM7_Handler.Init.Period=1;
TIM7_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&TIM7_Handler);
TIM7_Master.MasterOutputTrigger = TIM_TRGO_UPDATE;
TIM7_Master.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&TIM7_Handler,&TIM7_Master);
HAL_TIM_Base_Start(&TIM7_Handler);
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM5)
{
__HAL_RCC_TIM5_CLK_ENABLE();
}
if(htim->Instance==TIM7)
{
__HAL_RCC_TIM7_CLK_ENABLE();
}
}
main函数实时打印电压值
int main(void)
{
float tempV;
uint32_t tempInt;
float tempV1;
HAL_Init();
uart_init(115200);
DAC1_Init();
TIM5_Init();
TIM7_Init();
while(1)
{
tempInt= HAL_DAC_GetValue(&DAC_Handler,DAC_CHANNEL_2);
tempV=(float)tempInt*(3.3/4096);
tempInt= HAL_DAC_GetValue(&DAC_Handler,DAC_CHANNEL_1);
tempV1=(float)tempInt*(3.3/4096);
printf("ch1 = %.3f ch2 = %.3f\r\n",tempV,tempV1);
HAL_Delay(100);
}
}
这里也可以通过示波器测PA4和PA5引脚的输出波形。
最终效果
|