湘潭网站建设定制磐石网络,网站流量很少,上海外包软件开发,成都今天重大新闻事件这里本来是要讲输入捕获的知识点的#xff0c;但是由于学校校赛时间比较紧#xff0c;校赛没考到输入捕获#xff0c;所以先写ADC模拟电压测量的知识点。这里将的是单通道阻塞式采样。
Cubemx配置
点开cubemx。
1.将PB15配置为ADC2-IN15。 2.在Analog中点击ADC2#xff…这里本来是要讲输入捕获的知识点的但是由于学校校赛时间比较紧校赛没考到输入捕获所以先写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 22倍频
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_sta0x10;
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,dsLED8,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_valHAL_ADC_GetValue(hadc);adc_fadc_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 temp0;float frq10;float duty10;float adc_data_PB15;frq11000000.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_PB15adc_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_sta0x10;
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,dsLED8,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_valHAL_ADC_GetValue(hadc);adc_fadc_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 temp0;float frq10;float duty10;float adc_data_PB15;frq11000000.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_PB15adc_read_os(hadc2);sprintf(text, PB15%.4fV ,adc_data_PB15);LCD_DisplayStringLine(Line5,(uint8_t *)text);//局部刷新
}