赞
踩
本实验代码是基于单通道ADC采集实验进行编写
1,功能描述
通过ADC1通道16采集芯片内部温度传感器的电压,将电压值换算成温度后,显示在液晶屏(可看作四步:1、上电 2、采集 3、计算 4、显示)
2,确定最小刻度
VREF+ = 3.3V 0V≤VIN≤3.3V 最小刻度 = 3.3 / 4096 (分辨率:12位)
3,确定转换时间
采样时间239.5个ADC时钟周期为例,可以得到转换时间为21us
转换时间计算方法:
4,模式组合
单次转换模式、不使用扫描模式
- #include "./BSP/ADC/adc.h"
-
-
- ADC_HandleTypeDef g_adc_handle;
-
- /* ADC 内部温度传感器 初始化函数 */
- void adc_temperature_init(void)
- {
- ADC_ChannelConfTypeDef adc_ch_conf;
-
- g_adc_handle.Instance = ADC1;
- g_adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
- g_adc_handle.Init.ScanConvMode = ADC_SCAN_DISABLE;
- g_adc_handle.Init.ContinuousConvMode = DISABLE;
- g_adc_handle.Init.NbrOfConversion = 1;
- g_adc_handle.Init.DiscontinuousConvMode = DISABLE;
- g_adc_handle.Init.NbrOfDiscConversion = 0;
- g_adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
- HAL_ADC_Init(&g_adc_handle);
-
- HAL_ADCEx_Calibration_Start(&g_adc_handle);
-
- adc_ch_conf.Channel = ADC_CHANNEL_16;
- adc_ch_conf.Rank = ADC_REGULAR_RANK_1;
- adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
- HAL_ADC_ConfigChannel(&g_adc_handle, &adc_ch_conf);
- }
-
- /* ADC MSP初始化函数 */
- void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
- {
- if(hadc->Instance == ADC1)
- {
- RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
-
- __HAL_RCC_ADC1_CLK_ENABLE();
-
- adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC;
- adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6;
- HAL_RCCEx_PeriphCLKConfig(&adc_clk_init);
- }
- }
-
- /* 获得ADC转换后的结果函数 */
- uint32_t adc_get_result(void)
- {
- HAL_ADC_Start(&g_adc_handle);
- HAL_ADC_PollForConversion(&g_adc_handle, 10);
- return (uint16_t)HAL_ADC_GetValue(&g_adc_handle);
- }
-
- /* 获取内部温度传感器温度值 */
- short adc_get_temperature(void)
- {
- uint32_t adcx;
- short result;
- double temperature;
-
- adcx = adc_get_result();/*得到数字量*/
- temperature = adcx * (3.3 / 4096);/*数字量转换成电压值*/
- temperature = (1.43 - temperature) / 0.0043 + 25;/*温度计算*/
- result = temperature *= 100;
- return result;
- }
- #ifndef __ADC_H
- #define __ADC_H
-
- #include "./SYSTEM/sys/sys.h"
-
-
- void adc_temperature_init(void);
- uint32_t adc_get_result(void);
- short adc_get_temperature(void);
-
- #endif
-
-
- #include "./SYSTEM/sys/sys.h"
- #include "./SYSTEM/usart/usart.h"
- #include "./SYSTEM/delay/delay.h"
- #include "./USMART/usmart.h"
- #include "./BSP/LED/led.h"
- #include "./BSP/LCD/lcd.h"
- #include "./BSP/ADC/adc.h"
-
-
- int main(void)
- {
- short temp;
-
- HAL_Init(); /* 初始化HAL库 */
- sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
- delay_init(72); /* 延时初始化 */
- usart_init(115200); /* 串口初始化为115200 */
- led_init(); /* 初始化LED */
- lcd_init(); /* 初始化LCD */
- adc_temperature_init(); /* 初始化ADC内部温度传感器采集 */
-
- lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
- lcd_show_string(30, 70, 200, 16, 16, "Temperature TEST", RED);
- lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
- lcd_show_string(30, 120, 200, 16, 16, "TEMPERATE: 00.00C", BLUE);
-
- while (1)
- {
-
- temp = adc_get_temperature(); /* 得到温度值 */
-
- if (temp < 0)
- {
- temp = -temp;
- lcd_show_string(30 + 10 * 8, 120, 16, 16, 16, "-", BLUE); /* 显示负号 */
- }
- else
- {
- lcd_show_string(30 + 10 * 8, 120, 16, 16, 16, " ", BLUE); /* 无符号 */
- }
- lcd_show_xnum(30 + 11 * 8, 120, temp / 100, 2, 16, 0, BLUE); /* 显示整数部分 */
- lcd_show_xnum(30 + 14 * 8, 120, temp % 100, 2, 16, 0X80, BLUE); /* 显示小数部分 */
-
- LED0_TOGGLE(); /* LED0闪烁,提示程序运行 */
- delay_ms(250);
- }
- }
本实验代码是基于单通道ADC采集实验进行编写
1,功能描述
通过ADC3通道6(PF8)采集光敏二极管的电压,然后转换为0~100的光线强度值,并显示
2,确定最小刻度
VREF+ = 3.3V 0V≤VIN≤3.3V 最小刻度 = 3.3 / 4096
3,确定转换时间
采样时间239.5个ADC时钟周期为例,可以得到转换时间为21us
4,模式组合
单次转换模式、不使用扫描模式
- #include "./BSP/ADC/adc3.h"
-
-
- ADC_HandleTypeDef g_adc_handle;
-
- /* ADC单通道 */
- void adc3_init(void)
- {
- ADC_ChannelConfTypeDef adc_ch_conf;
-
- g_adc_handle.Instance = ADC3;
- g_adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
- g_adc_handle.Init.ScanConvMode = ADC_SCAN_DISABLE;
- g_adc_handle.Init.ContinuousConvMode = DISABLE;
- g_adc_handle.Init.NbrOfConversion = 1;
- g_adc_handle.Init.DiscontinuousConvMode = DISABLE;
- g_adc_handle.Init.NbrOfDiscConversion = 0;
- g_adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
- HAL_ADC_Init(&g_adc_handle);
-
- HAL_ADCEx_Calibration_Start(&g_adc_handle);
-
- adc_ch_conf.Channel = ADC_CHANNEL_6;
- adc_ch_conf.Rank = ADC_REGULAR_RANK_1;
- adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
- HAL_ADC_ConfigChannel(&g_adc_handle, &adc_ch_conf);
- }
-
- /* ADC MSP初始化函数 */
- void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
- {
- if(hadc->Instance == ADC3)
- {
- GPIO_InitTypeDef gpio_init_struct;
- RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
-
- __HAL_RCC_GPIOF_CLK_ENABLE();
- __HAL_RCC_ADC3_CLK_ENABLE();
-
- gpio_init_struct.Pin = GPIO_PIN_8;
- gpio_init_struct.Mode = GPIO_MODE_ANALOG;
- HAL_GPIO_Init(GPIOF, &gpio_init_struct);
-
- adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC;
- adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6;
- HAL_RCCEx_PeriphCLKConfig(&adc_clk_init);
- }
- }
-
- /* 获得ADC转换后的结果函数 */
- uint32_t adc_get_result(void)
- {
- HAL_ADC_Start(&g_adc_handle);
- HAL_ADC_PollForConversion(&g_adc_handle, 10);
- return (uint16_t)HAL_ADC_GetValue(&g_adc_handle);
- }
-
- /* 读取光敏传感器值 */
- uint8_t lsens_get_val(void)
- {
- uint32_t temp_val;
-
- temp_val = adc_get_result();
- temp_val /= 40; /*把转换到的数字量转换为0 ~ 100 之间的数*/
-
- if (temp_val > 100) temp_val = 100;
-
- return (uint8_t)(100 - temp_val); /*光强与转化值为负相关 光强越大电压越小*/
- }
- #ifndef __ADC_H
- #define __ADC_H
-
- #include "./SYSTEM/sys/sys.h"
-
-
- void adc3_init(void);
- uint32_t adc_get_result(void);
- uint8_t lsens_get_val(void);
-
- #endif
-
-
- #include "./SYSTEM/sys/sys.h"
- #include "./SYSTEM/usart/usart.h"
- #include "./SYSTEM/delay/delay.h"
- #include "./USMART/usmart.h"
- #include "./BSP/LED/led.h"
- #include "./BSP/LCD/lcd.h"
- #include "./BSP/ADC/adc3.h"
-
-
- int main(void)
- {
- short adcx;
-
- HAL_Init(); /* 初始化HAL库 */
- sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
- delay_init(72); /* 延时初始化 */
- usart_init(115200); /* 串口初始化为115200 */
- led_init(); /* 初始化LED */
- lcd_init(); /* 初始化LCD */
- adc3_init(); /* 初始化ADC3 */
-
- lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
- lcd_show_string(30, 70, 200, 16, 16, "LSENS TEST", RED);
- lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
- lcd_show_string(30, 110, 200, 16, 16, "LSENS_VAL:", BLUE);
-
- while (1)
- {
- adcx = lsens_get_val();
- lcd_show_xnum(30 + 10 * 8, 110, adcx, 3, 16, 0, BLUE); /* 显示ADC的值 */
- LED0_TOGGLE(); /* LED0闪烁,提示程序运行 */
- delay_ms(250);
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。