一.stm32上ADC,DAC的应用说明:
1.首先ADC是将模拟信号转成数字信号,DAC则相反。
(模拟信号可以简单的理解为温度,光照,压力等,数字信号则可以是电压等),
2.一般某些传感器上会标出AO,DO,AI,DI。
其中AO叫做模拟量输出,DO数字信号输出。AI,DI则对应着输入。
(未知)AO–>转化–>DI(对应的数字信号)。
进一步解读:可以看成AO是模拟信号采集以后输出给数字信号DI接收后经过数据处理就得到了对应的电压数值,而这些电压数字一般和模拟量之间存在这一些数学转换公式,此过程就是ADC采集数据。
(已知)DO->处理->AI(对应的模拟量)。
此处解读:可以看成是通过改变数字信号(电压)DO输出给模拟信号AI接受后使模拟量发生改变,对应DAC。
3.认识ADC在引脚上的位置
此处ADC123,指该芯片上的三个ADC,
_IN1,指通道1。
stm32fxxadc.h中主要有两个结构体需注意。
typedef struct
{
uint32_t ADC_Resolution; //ADC 分辨率选择
FunctionalState ADC_ScanConvMode; //ADC 扫描选择
FunctionalState ADC_ContinuousConvMode; //ADC 连续转换模式选择
uint32_t ADC_ExternalTrigConvEdge; //ADC 外部触发极性
uint32_t ADC_ExternalTrigConv; //ADC 外部触发选择
uint32_t ADC_DataAlign; //输出数据对齐方式
uint8_t ADC_NbrOfChannel; //转换通道数目
} ADC_InitTypeDef;
typedef struct
{
uint32_t ADC_Mode; //ADC 模式选择
uint32_t ADC_Prescaler; //ADC 分频系数
uint32_t ADC_DMAAccessMode; //DMA 模式配置
uint32_t ADC_TwoSamplingDelay; //采样延迟
} ADC_CommonInitTypeDef;
不使用dma时adc初始化函数:
static void _ADC_Mode_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
// 开启 ADC 时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADCx , ENABLE);
// -------------------ADC Common 结构体 参数 初始化--------------------
// 独立 ADC 模式
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
// 时钟为 fpclk x 分频 (ADC输入时钟fpck=HCLK/分频系数,此处的HCLK就是设置的系统时钟:fpck=hack/4=168/4=42Mhz)
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
// 禁止 DMA 直接访问模式
ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled;
// 采样时间间隔 周期=1/42=0.023 T=5+12=17(周期)=17*0.023= 0.4us 采集一次
ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_20Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
// ---------------