嵌入式蓝桥杯学习8 模拟电压测量

这里本来是要讲输入捕获的知识点的,但是由于学校校赛时间比较紧,校赛没考到输入捕获,所以先写ADC模拟电压测量的知识点。这里将的是单通道阻塞式采样。

Cubemx配置

点开cubemx。

1.将PB15配置为ADC2-IN15。

2.在Analog中点击ADC2,勾选IN15 Single-ended。

3.配置Paramater Settings中的参数。

Mode(模式):Independent mode

Clock Prescaler(分频):Synchronus clock mode divided by 2(2倍频)

Resolution(分辨率):ADC 12-bit resolution

Data Alignment(数据对齐):Right alignment(右对齐)

Scan Conversion Mode(扫描):Disable

Continuous Conversion Mode(连续模式):Disable

4.配置ADC_Regular_ConversionMode

Enable Regular Conversion(规则转换通道):Enable

Number Of Conversion(转换通道数量):1

External Trigger Conversion Sourse(触发源选择):Regular Conversion launched by software(软件触发)

Sampling Time(采样时间):2.5Cycles。

点击GENERATE CODE.

代码编写

补充知识

HAL_ADC_GetValue(hadc);

功能:当 ADC 完成一次模拟信号到数字信号的转换后,转换得到的数字值就会被存储在相应的寄存器中。而 HAL_ADC_GetValue(hadc) 函数所做的就是从这个与 ADC 对应的寄存器(具体是数据寄存器)里读出刚刚转换好的数字值,方便后续在程序中对这个代表模拟量大小的数字值进行进一步处理。

HAL_ADC_Start(hadc)

功能:主要用于启动模数转换器(ADC)的转换工作。

HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED)

功能:启动模数转换器(ADC)校准过程的作用。

my_main.c

复制代码
#include "my_main.h"
#include "stm32g4xx_hal_adc.h"
#include "adc.h"
uint8_t led_sta=0x10;
char text[30];
extern struct Bkeys bkey[];

void LED_Disp(uint8_t dsLED)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭(l小写)
	HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位:控制C8-15引脚,值为1的点亮
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
float adc_read(ADC_HandleTypeDef *hadc)
{
	uint16_t adc_val;
	float adc_f;
	HAL_ADC_Start(hadc);
	adc_val=HAL_ADC_GetValue(hadc);
	adc_f=adc_val*3.3f/4096.0f;
	return adc_f;
}
void setup()
{
	HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);
	LED_Disp(0x00);//关掉所有LED	
	LCD_Init();//LCD初始化
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
}

void loop()
{
	static uint16_t temp=0;
	float frq1=0;
	float duty1=0;
	float adc_data_PB15;
	frq1=1000000.0f/(HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1);
	duty1=((HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_2)+1)*100.0f/(HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1));
	sprintf(text,"    FRQ=%.2fHz    ",frq1);
	LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
	sprintf(text,"    DUTY=%.2fHz    ",duty1);
	LCD_DisplayStringLine(Line9,(uint8_t *)text);//局部刷新	
	adc_data_PB15=adc_read(&hadc2);
	sprintf(text,"    PB15=%.4fV    ",adc_data_PB15);
	LCD_DisplayStringLine(Line5,(uint8_t *)text);//局部刷新	

}

拓展:过采样读取ADC

由于蓝桥杯比赛会对精度进行要求,所以我们也就引入了过采样读取ADC。

首先打开前面改过的cubemx,将Paramater Settings中的Enable Regular Oversampling 设置为Enable。然后将Oversampling Right Shift设置为3 bit shift for oversampling,最后将Oversampling Ratio设置为Oversampling Ratio 128x,点击GENERATE CODE.

my_main.c

复制代码
#include "my_main.h"
#include "stm32g4xx_hal_adc.h"
#include "adc.h"
uint8_t led_sta=0x10;
char text[30];
extern struct Bkeys bkey[];

void LED_Disp(uint8_t dsLED)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭(l小写)
	HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位:控制C8-15引脚,值为1的点亮
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
float adc_read_os(ADC_HandleTypeDef *hadc)//带 过采样
{
	uint16_t adc_val;
	float adc_f;
	HAL_ADC_Start(hadc);
	adc_val=HAL_ADC_GetValue(hadc);
	adc_f=adc_val*3.3f/65536.0f;
	return adc_f;
}
void setup()
{
	HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);
	LED_Disp(0x00);//关掉所有LED	
	LCD_Init();//LCD初始化
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
}

void loop()
{
	static uint16_t temp=0;
	float frq1=0;
	float duty1=0;
	float adc_data_PB15;
	frq1=1000000.0f/(HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1);
	duty1=((HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_2)+1)*100.0f/(HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1));
	sprintf(text,"    FRQ=%.2fHz    ",frq1);
	LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
	sprintf(text,"    DUTY=%.2fHz    ",duty1);
	LCD_DisplayStringLine(Line5,(uint8_t *)text);//局部刷新	
	adc_data_PB15=adc_read_os(&hadc2);
	sprintf(text,"    PB15=%.4fV    ",adc_data_PB15);
	LCD_DisplayStringLine(Line5,(uint8_t *)text);//局部刷新	
}
相关推荐
集芯微电科技有限公司3 分钟前
低压功率MOSFETs选型手册
人工智能·单片机·嵌入式硬件·神经网络·生成对抗网络
MartinYeung518 分钟前
[论文学习]智能合约不变式防御网络犯罪
网络·学习·智能合约
xx~t20 分钟前
嵌入式学习——进程与线程2
linux·c语言·学习·进程与线程
我爱cope29 分钟前
【计算机网络 | 网络层10:OSPF 与 BGP:自治系统内部和互联网之间如何路由?】
网络·学习·计算机网络·智能路由器
白猫不黑33 分钟前
网络空间安全/信息安全专业学习规划(超级详细版)
运维·学习·安全·web安全·网络安全·信息安全
HyperAI超神经41 分钟前
MiniMax H3 突破视频生成边界,音画内容一体生成;Ornith-1.5-35B-A3B 探索推理模型自进化训练新模式
人工智能·深度学习·学习·音视频·多模态·视频生成·推理模型
小小帅呀1 小时前
学习 VLA 第6天:SWIN VIT算法原理以及复现
学习·算法
平原20181 小时前
AI岗位需求增长244%背后:从任务重组到可验证学习闭环
大数据·人工智能·学习
ouynagda1 小时前
Linux信号与进程间通信学习笔记
linux·笔记·学习
️学习的小王1 小时前
AI Agent Skills进阶:调试、排错、实战开发与工程化落地
人工智能·经验分享·笔记·学习