芯源半导体CW32
直播中

TLLED

11年用户 206经验值
擅长:嵌入式技术
私信 关注
[经验]

【CW32饭盒派开发板试用体验】- ADC电压采集测试

学习下ADC电压采集测试。
测试硬件,使用开发板底板上的电位器来采集电源的电压值,通过串口打印出来。

一、ADC特性

主要特性
• 12 位精度
• 可编程转换速度,最高达 1M SPS
• 16 路输入转换通道
- 13 路外部引脚输入
- 内置温度传感器
- 内置 BGR 1.2V 基准
- 1/3 VDDA 电源电压
• 4 路参考电压源(Vref)
- VDDA 电源电压
- ExRef(PB00)引脚电压
- 内置 1.5V 参考电压
- 内置 2.5V 参考电压
• 采样电压输入范围:0 ~ Vref
• 多种转换模式,全部支持转换累加功能
- 单次转换
- 多次转换
- 连续转换
- 序列扫描转换
- 序列断续转换
• 支持单通道、序列通道两种通道选择,最大同时支持 4 个序列
• 支持输入通道电压阈值监测
• 内置信号跟随器,可转换高阻抗输入信号

二、硬件电路
ADC部分电路图
001.png

电位器分压后,送到MCU的PB0端口上。

三、测试程序

3.1、adc.c

#include "main.h"

void init_adc(void)
{
	ADC_SingleChTypeDef ADC_SingleInitStruct;

  __RCC_ADC_CLK_ENABLE();    // ADC时钟使能
	__RCC_GPIOB_CLK_ENABLE();

	//配置ADC测试IO口  电位器接口
  PB00_ANALOG_ENABLE();
  ADC_SingleInitStruct.ADC_Chmux = ADC_ExInputCH8;         //通道4输入PB00
  ADC_SingleInitStruct.ADC_DiscardEn = ADC_DiscardNull;
  ADC_SingleInitStruct.ADC_InitStruct.ADC_AccEn = ADC_AccDisable;   //转换结果累加不使能
  ADC_SingleInitStruct.ADC_InitStruct.ADC_Align = ADC_AlignRight;   //ADC转换结果右对齐
  ADC_SingleInitStruct.ADC_InitStruct.ADC_ClkDiv = ADC_Clk_Div16;   //PCLK  
  ADC_SingleInitStruct.ADC_InitStruct.ADC_DMAEn = ADC_DmaDisable;   //关闭DMA传输
  ADC_SingleInitStruct.ADC_InitStruct.ADC_InBufEn = ADC_BufEnable;  //开启跟随器
  ADC_SingleInitStruct.ADC_InitStruct.ADC_OpMode = ADC_SingleChOneMode;   
  ADC_SingleInitStruct.ADC_InitStruct.ADC_SampleTime = ADC_SampTime5Clk; //5个ADC时钟周期
  ADC_SingleInitStruct.ADC_InitStruct.ADC_TsEn = ADC_TsDisable;    //内置温度传感器禁用
  ADC_SingleInitStruct.ADC_InitStruct.ADC_VrefSel = ADC_Vref_VDDA;//VDDA参考电压
  ADC_SingleInitStruct.ADC_WdtStruct.ADC_WdtAll = ADC_WdtDisable;    

  ADC_SingleChOneModeCfg(&ADC_SingleInitStruct);
  ADC_Enable();    // 使能ADC
	
	ADC_SoftwareStartConvCmd(ENABLE);
}


uint16_t read_adc_val(void)
{
	uint16_t adc_val=0;
	ADC_SoftwareStartConvCmd(ENABLE);
	while(ADC_GetITStatus(ADC_IT_EOC))
	{
		ADC_ClearITPendingBit(ADC_IT_EOC);      
		adc_val=ADC_GetConversionValue();	
		return adc_val;
	} 				
}

void adc_test(void)
{
	uint16_t adv=0;
	adv=read_adc_val();
	printf("adc电压值=%0.1f V\r\n",(float)adv*(3.3/4096));
}

3.2、main.c

int32_t main(void)
{
		rcc_config();
		delay_init();
		uart_init(115200);	
    init_led();
		init_adc();
		

    while (1)
    {
				led1_tog(); 
				//printf("\r\nCW32F030 UART Printf Example\r\n");
				adc_test();
				delay_ms(100);
    }
}

四、程序运行

程序运行后,串口输出内容:

002.png

更多回帖

发帖
×
20
完善资料,
赚取积分