gd32 adc采集电压转换
时间: 2023-09-17 21:06:32 浏览: 290
GD32系列的ADC模块支持多种采样方式和转换模式,可以通过不同的配置实现电压转换。
以下是一个简单的示例代码,演示了如何使用GD32的ADC模块进行电压转换并获取转换结果:
```c
#include "gd32f30x.h"
void adc_init(void)
{
/* 使能 ADC0 时钟 */
rcu_periph_clock_enable(RCU_ADC0);
/* 配置 ADC0 时钟分频为 8 */
adc_clock_config(ADC0, ADC_CLOCK_SYNC_PCLK_DIV8);
/* 配置 ADC0 触发源为软件触发 */
adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
/* 配置 ADC0 为单次转换模式 */
adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE);
adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE);
adc_special_function_config(ADC0, ADC_DISCONTINUOUS_MODE, DISABLE);
adc_special_function_config(ADC0, ADC_DATA_ALIGN, ADC_DATAALIGN_RIGHT);
adc_special_function_config(ADC0, ADC_TRIGGER_MODE, ADC_TRIG_MODE_SOFTWARE);
adc_special_function_config(ADC0, ADC_CHANNEL_DISCON_DISABLE, ADC_REGULAR_CHANNEL);
/* 配置 ADC0 通道 0 */
adc_regular_channel_config(ADC0, 0, ADC_SAMPLETIME_239POINT5, ADC_CHANNEL_0, ADC_REGULAR_DIFF_DISABLE);
/* 使能 ADC0 */
adc_enable(ADC0);
}
uint16_t adc_get_value(void)
{
uint16_t adc_value;
/* 启动 ADC0 转换 */
adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
/* 等待转换完成 */
while (!adc_flag_get(ADC0, ADC_FLAG_EOC));
/* 读取转换结果 */
adc_value = adc_regular_data_read(ADC0);
return adc_value;
}
int main(void)
{
uint16_t adc_value;
/* 初始化 ADC0 */
adc_init();
/* 循环读取电压并输出 */
while (1) {
adc_value = adc_get_value();
printf("Voltage: %.2fV\r\n", ((float)adc_value / 4096.0) * 3.3);
}
return 0;
}
```
在这个示例中,我们使用ADC0通道0进行电压转换。首先,在`adc_init`函数中进行ADC模块的初始化配置,包括时钟分频、触发源、转换模式、对齐方式、通道配置等。然后,在`adc_get_value`函数中启动ADC转换,并等待转换完成。最后,读取转换结果并计算电压值。
需要注意的是,ADC转换结果是一个16位的无符号整数,需要通过电压分压电路或其他方式将被测量电压转换为符合ADC输入电压范围的电压信号。在这个示例中,我们假设被测量电压范围为0-3.3V,因此将ADC参考电压设置为3.3V,并将转换结果除以4096(2的12次方)得到电压值。
阅读全文