原理图
电压采集原理
ADC获取ADC采样值并转化为电压。串流分压,不同电阻的比值就是电压比值,所以可以计算出最上方的电压值。也可以通过电流计算。
ADC配置
float adc_volt;
float adc_volt_org;
uint16_t count_adc = 0;
void delay_count()
{
while(count_adc)
{
count_adc--;
}
count_adc = 20000;
}
/* ADC的附加功能 优先于普通GPIO */
static void adc_gpio_init(void)
{
// PC5 ADC01_IN15
/* enable the clock */
rcu_periph_clock_enable(ADCX_RCU);
/* configure GPIO port 附加功能需要配置为 GPIO_MODE_ANALOG 模拟模式 */
gpio_mode_set(ADCX_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE,ADCX_PIN);
}
void adc_config(void)
{
//RCU
/* enable ADC0 clock */
rcu_periph_clock_enable(RCU_ADC0);
/* config ADC clock */
adc_clock_config(ADC_ADCCK_PCLK2_DIV8);//ADC0 挂载在APB2 100MHz MAX:40MHz
/* reset ADC */
adc_deinit();
/* configure the ADC mode */
adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT); // 所有ADC都工作在独立模式
//采样模式
/* ADC contineous function disable */
adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE); // 关闭连续模式
/* ADC scan mode disable */
adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE); // 关闭扫描模式
//通常右对齐
/* ADC data alignment config */
adc_data_alignment_config(ADC0,ADC_DATAALIGN_RIGHT); // LSB对齐,低位对齐
/* ADC channel length config */
adc_channel_length_config(ADC0,ADC_REGULAR_CHANNEL,1U); // ADC规则通道 长度为1
/* enable ADC interface */
adc_enable(ADC0);
/* wait for ADC stability */
//vTaskDelay(1);
delay_count();
/* ADC calibration and reset calibration */
adc_calibration_enable(ADC0); // ADC校准
/* wait for ADC stability */
//vTaskDelay(1);
delay_count();
/* adc 引脚初始化 */
adc_gpio_init();
}
/*!
\brief ADC channel sample ADC通道采样
\param[in] none
\param[out] none
\retval none
*/
uint16_t adc_channel_sample(void)
{
/* ADC regular channel config */
adc_regular_channel_config(ADC0, 0U, ADC_CHANNEL_15 , ADC_SAMPLETIME_15); // 15个采样周期
/* ADC software trigger enable */
adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); // ADC软件触发使能
/* wait the end of conversion flag */
while(!adc_flag_get(ADC0, ADC_FLAG_EOC));
/* clear the end of conversion flag */
adc_flag_clear(ADC0, ADC_FLAG_EOC);
/* return regular channel sample value */
return (adc_regular_data_read(ADC0));
}
void adc_volt_scan(void)
{
// 采样
adc_volt_org = adc_channel_sample();
//转换
adc_volt_org *= 3300;
adc_volt_org /= 4095;
adc_volt_org *= 3;
adc_volt_org /= 1000;
adc_volt = adc_volt_org;
}
使用
完成初始化,调用adc_volt_scan函数,然后外部获取adc_volt的数值就是ADC电压值。