STM32 ADC与DAC

STM32 ADC

STM32 的 ADC 最大的转换速率为 1Mhz,也就是转换时间为 1us(在 ADCCLK=14M,采样周期
为 1.5 个 ADC 时钟下得到),不要让 ADC 的时钟超过 14M,否则将导致结果准确度下降。
STM32 其 ADC 的规则通道组最多包含 16 个转换,而注入通道组最多包含 4 个通道。规则通道是正常运行的程序,注入通道相当于中断。
ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。

初始化ADC参数

RCC_ADCCLKConfig(RCC_PCLK2_Div6);//分频因子是6 72M/6 = 12M 没有超过上文说的14M
ADC_DeInit(ADC1); //复位时钟
初始化参数组
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC 工作模式:独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //AD 单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //AD 单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
//转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC 数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的 ADC 通道的数目 1
ADC_Init(ADC1, &ADC_InitStructure); //根据指定的参数初始化外设 ADCx

ADC_Cmd(ADC1, ENABLE); //使能指定的 ADC1
ADC_ResetCalibration(ADC1); //开启复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启 AD 校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束

获取AD值

//设置指定 ADC 的规则组通道,设置它们的转化顺序和采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );
//通道 1,规则采样顺序值为 1,采样时间为 239.5 周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能软件转换功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次 ADC1 规则组的转换结果

AD参考电压

计算公式如下
V(ADC)=Value(ADC)*V(ref)/4096

V电压
Value是ADC值
ref 参考电压 STM32F103ZET6,该芯片有外部参考电压: Vref-和 Vref+通过跳线相连VSSD 和GND两个引脚参考电压最高3.3V最低GND
4096又是什么呢?因为STM32ADC最大可进行16位的AD转换 0-4095

STM32 DAC

STM32 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的 DAC。 DAC 可以配置为 8 位或 12 位模式。DAC 模块有 2 个输出通道,每个通道都有单独的转换器。在双 DAC模式下, 2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个通道的输出。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE ); //使能 DAC 通道时钟

DAC_InitTypeDef DAC_InitType;
DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用触发功能 TEN1=0
DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;
DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1 输出缓存关闭
DAC_Init(DAC_Channel_1,&DAC_InitType); //初始化 DAC 通道 1
DAC_Cmd(DAC_Channel_1, ENABLE); //使能 DAC1

DAC_SetChannel1Data(DAC_Align_12b_R, 0);//设置输出值
DAC_GetDataOutputValue(DAC_Channel_1);//获取输入值


发布了15 篇原创文章 · 获赞 1 · 访问量 522

猜你喜欢

转载自blog.csdn.net/weixin_42323243/article/details/103939197