在项目中偶尔会使用DA转换器,我使用的MCU是STM8L151G6U6。我是用的是PB4作为DA输出管脚,查阅该芯片的Reference manual手册可知,PB4是属于DAC_OUT1,即DAC通道一。
再查阅PB4输入输出控制,PB4对应的是开关15。
下面是我用软件触发模式使用的DAC配置代码。
dac.h头文件代码如下:
#ifndef __DAC_H__
#define __DAC_H__
#ifdef __cplusplus
extern "C"{
#endif
#include "stm8l15x.h"
/* DAC_OUT ---> PB4(DAC_OUT) */
#define DAC_OUT_PORT (GPIOB)
#define DAC_OUT_PIN (GPIO_Pin_4)
/* Function prototype */
void DAC_Init(void);
#ifdef __cplusplus
}
#endif
#endif /* End define macro __DAC_H__ */
dac.c源文件代码如下:
#include "dac.h"
/*
** @ Brief: Init DAC
** @ Parameter: None
** @ Return: None
**/
void DAC_Init(void)
{
/* Configure DAC GPIO pin */
GPIO_Init(DAC_OUT_PORT, DAC_OUT_PIN, GPIO_Mode_In_FL_No_IT);
/* Enable comparator clock */
CLK_PeripheralClockConfig(CLK_Peripheral_COMP,ENABLE);
/* Enable DAC Clock */
CLK_PeripheralClockConfig(CLK_Peripheral_DAC, ENABLE);
/* Enable PB4 input output switch */
SYSCFG_RIIOSwitchConfig(RI_IOSwitch_15, ENABLE);
/* Init DAC channel 1 output and enable output buffer */
DAC_DeInit();
DAC_Init(DAC_Channel_1, DAC_Trigger_Software, DAC_OutputBuffer_Enable);
/* Enable the selected DAC channel wave generation */
DAC_WaveGenerationCmd(DAC_Channel_1, DAC_Wave_Triangle, ENABLE);
/* Select DAC Triangle Wave Generation Amplitude according to the specified parameters */
DAC_SetTriangleWaveAmplitude(DAC_Channel_1, DAC_TriangleAmplitude_4095);
/* Enables the specified DAC channel. */
DAC_Cmd(DAC_Channel_1, ENABLE);
}
在main.c中,使用DAC转换器的代码如下;
#include "dac.h"
void main(void)
{
uint16_t DACData = 0;
DAC_Init();
while(1)
{
for(DACData = 0; DACData < 4096; DACData++)
{
DAC_SetChannel1Data(DAC_Align_12b_R, DACData);
DAC_SoftwareTriggerCmd(DAC_Channel_1, ENABLE);
}
}
}
用示波器测量PB4会发现,电压值从小到大循环往复。转换关系为:
输出电压 = DACData * 参考电压 / 4096;
其中4096为DAC触发振幅,由初始化参数DAC_TriangleAmplitude_4095设定,可以更改;DACData为输入的需要转换的值,范围0~触发振幅(这里为4096);参考电压一般为板子工作的所需的正常电压,我的为3.3V。