启用ADC采集功能,通过PB1口采集模拟电压。
ADC驱动配置大致分为以下步骤:
开启ADC1/2对应时钟
配置ADC初始化参数
使能ADC通道
等待ADC转换
读取ADC转换的数值
硬件电路
原理图如下:
数据手册上PB1对应的ADC通道:
编写程序
1.ADC初始化函数
/*ADC Init - PB1*/
void Adc_Init(void)
{
// /* Enable ADC1 clock */
// CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
/* Initialise and configure ADC1 */
ADC_Init(ADC1, ADC_ConversionMode_Continuous, ADC_Resolution_12Bit, ADC_Prescaler_2);
ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable ADC1 Channel 17 */
ADC_ChannelCmd(ADC1, ADC_Channel_17, ENABLE);
/* Start ADC1 Conversion using Software trigger*/
ADC_SoftwareStartConv(ADC1);
}
2.ADC读取转换值函数
uint16_t Adc_GetValue(void)
{
/* Start ADC1 Conversion using Software trigger*/
ADC_SoftwareStartConv(ADC1);
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}
功能实现
这里我使用OLED屏来显示采集到的ADC值,并通过相应的关系来换算出电压值。
/**
* @brief System display.
* @param None
* @retval None
*/
void System_Display(void)
{
uint8_t Buff[40];
uint16_t Adc_Data;
uint16_t Adc_Value;
/*Adc Data*/
Adc_Data = Adc_GetValue();
sprintf((char *)Buff,"Dat: %-4d", Adc_Data);
OLED_ShowString(0,1,Buff,12);
/*Adc Value*/
Adc_Value = 3300 * Adc_Data / 4096;
sprintf((char *)Buff,"Val: %-4d mV", Adc_Value);
OLED_ShowString(0,2,Buff,12);
#if OLED_MODE == 0 //SPI
/*更新值*/
OLED_Refresh_Gram();
#endif
}
总结
ADC采集部分跟其他单片机开发一样的流程,不是很难。