• STM32 HAL库F103系列之ADC实验(三)


    内部温度传感器实验

    本实验代码是基于单通道ADC采集实验进行编写

    STM32内部温度传感器介绍

     温度计算方法

     实验简要

    1,功能描述

            通过ADC1通道16采集芯片内部温度传感器的电压,将电压值换算成温度后,显示在液晶屏(可看作四步:1、上电 2、采集 3、计算 4、显示)

    2,确定最小刻度

            VREF+ = 3.3V  0VVIN3.3V  最小刻度 = 3.3 / 4096  (分辨率:12位)

    3,确定转换时间

            采样时间239.5ADC时钟周期为例,可以得到转换时间为21us

    转换时间计算方法:

    4,模式组合

            单次转换模式、不使用扫描模式

    源码

    adc.c

    1. #include "./BSP/ADC/adc.h"
    2. ADC_HandleTypeDef g_adc_handle;
    3. /* ADC 内部温度传感器 初始化函数 */
    4. void adc_temperature_init(void)
    5. {
    6. ADC_ChannelConfTypeDef adc_ch_conf;
    7. g_adc_handle.Instance = ADC1;
    8. g_adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    9. g_adc_handle.Init.ScanConvMode = ADC_SCAN_DISABLE;
    10. g_adc_handle.Init.ContinuousConvMode = DISABLE;
    11. g_adc_handle.Init.NbrOfConversion = 1;
    12. g_adc_handle.Init.DiscontinuousConvMode = DISABLE;
    13. g_adc_handle.Init.NbrOfDiscConversion = 0;
    14. g_adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    15. HAL_ADC_Init(&g_adc_handle);
    16. HAL_ADCEx_Calibration_Start(&g_adc_handle);
    17. adc_ch_conf.Channel = ADC_CHANNEL_16;
    18. adc_ch_conf.Rank = ADC_REGULAR_RANK_1;
    19. adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
    20. HAL_ADC_ConfigChannel(&g_adc_handle, &adc_ch_conf);
    21. }
    22. /* ADC MSP初始化函数 */
    23. void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
    24. {
    25. if(hadc->Instance == ADC1)
    26. {
    27. RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
    28. __HAL_RCC_ADC1_CLK_ENABLE();
    29. adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC;
    30. adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6;
    31. HAL_RCCEx_PeriphCLKConfig(&adc_clk_init);
    32. }
    33. }
    34. /* 获得ADC转换后的结果函数 */
    35. uint32_t adc_get_result(void)
    36. {
    37. HAL_ADC_Start(&g_adc_handle);
    38. HAL_ADC_PollForConversion(&g_adc_handle, 10);
    39. return (uint16_t)HAL_ADC_GetValue(&g_adc_handle);
    40. }
    41. /* 获取内部温度传感器温度值 */
    42. short adc_get_temperature(void)
    43. {
    44. uint32_t adcx;
    45. short result;
    46. double temperature;
    47. adcx = adc_get_result();/*得到数字量*/
    48. temperature = adcx * (3.3 / 4096);/*数字量转换成电压值*/
    49. temperature = (1.43 - temperature) / 0.0043 + 25;/*温度计算*/
    50. result = temperature *= 100;
    51. return result;
    52. }

    adc.h

    1. #ifndef __ADC_H
    2. #define __ADC_H
    3. #include "./SYSTEM/sys/sys.h"
    4. void adc_temperature_init(void);
    5. uint32_t adc_get_result(void);
    6. short adc_get_temperature(void);
    7. #endif

    main.c

    1. #include "./SYSTEM/sys/sys.h"
    2. #include "./SYSTEM/usart/usart.h"
    3. #include "./SYSTEM/delay/delay.h"
    4. #include "./USMART/usmart.h"
    5. #include "./BSP/LED/led.h"
    6. #include "./BSP/LCD/lcd.h"
    7. #include "./BSP/ADC/adc.h"
    8. int main(void)
    9. {
    10. short temp;
    11. HAL_Init(); /* 初始化HAL库 */
    12. sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    13. delay_init(72); /* 延时初始化 */
    14. usart_init(115200); /* 串口初始化为115200 */
    15. led_init(); /* 初始化LED */
    16. lcd_init(); /* 初始化LCD */
    17. adc_temperature_init(); /* 初始化ADC内部温度传感器采集 */
    18. lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
    19. lcd_show_string(30, 70, 200, 16, 16, "Temperature TEST", RED);
    20. lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
    21. lcd_show_string(30, 120, 200, 16, 16, "TEMPERATE: 00.00C", BLUE);
    22. while (1)
    23. {
    24. temp = adc_get_temperature(); /* 得到温度值 */
    25. if (temp < 0)
    26. {
    27. temp = -temp;
    28. lcd_show_string(30 + 10 * 8, 120, 16, 16, 16, "-", BLUE); /* 显示负号 */
    29. }
    30. else
    31. {
    32. lcd_show_string(30 + 10 * 8, 120, 16, 16, 16, " ", BLUE); /* 无符号 */
    33. }
    34. lcd_show_xnum(30 + 11 * 8, 120, temp / 100, 2, 16, 0, BLUE); /* 显示整数部分 */
    35. lcd_show_xnum(30 + 14 * 8, 120, temp % 100, 2, 16, 0X80, BLUE); /* 显示小数部分 */
    36. LED0_TOGGLE(); /* LED0闪烁,提示程序运行 */
    37. delay_ms(250);
    38. }
    39. }

    光敏传感器实验

    本实验代码是基于单通道ADC采集实验进行编写

    光敏二极管原理图

     实验简要

    1,功能描述

            通过ADC3通道6PF8)采集光敏二极管的电压,然后转换为0~100的光线强度值,并显示

    2,确定最小刻度

            VREF+ = 3.3V  0VVIN3.3V  最小刻度 = 3.3 / 4096

    3,确定转换时间

            采样时间239.5ADC时钟周期为例,可以得到转换时间为21us

    4,模式组合

            单次转换模式、不使用扫描模式

    源码

    adc.c

    1. #include "./BSP/ADC/adc3.h"
    2. ADC_HandleTypeDef g_adc_handle;
    3. /* ADC单通道 */
    4. void adc3_init(void)
    5. {
    6. ADC_ChannelConfTypeDef adc_ch_conf;
    7. g_adc_handle.Instance = ADC3;
    8. g_adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    9. g_adc_handle.Init.ScanConvMode = ADC_SCAN_DISABLE;
    10. g_adc_handle.Init.ContinuousConvMode = DISABLE;
    11. g_adc_handle.Init.NbrOfConversion = 1;
    12. g_adc_handle.Init.DiscontinuousConvMode = DISABLE;
    13. g_adc_handle.Init.NbrOfDiscConversion = 0;
    14. g_adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    15. HAL_ADC_Init(&g_adc_handle);
    16. HAL_ADCEx_Calibration_Start(&g_adc_handle);
    17. adc_ch_conf.Channel = ADC_CHANNEL_6;
    18. adc_ch_conf.Rank = ADC_REGULAR_RANK_1;
    19. adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
    20. HAL_ADC_ConfigChannel(&g_adc_handle, &adc_ch_conf);
    21. }
    22. /* ADC MSP初始化函数 */
    23. void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
    24. {
    25. if(hadc->Instance == ADC3)
    26. {
    27. GPIO_InitTypeDef gpio_init_struct;
    28. RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
    29. __HAL_RCC_GPIOF_CLK_ENABLE();
    30. __HAL_RCC_ADC3_CLK_ENABLE();
    31. gpio_init_struct.Pin = GPIO_PIN_8;
    32. gpio_init_struct.Mode = GPIO_MODE_ANALOG;
    33. HAL_GPIO_Init(GPIOF, &gpio_init_struct);
    34. adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC;
    35. adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6;
    36. HAL_RCCEx_PeriphCLKConfig(&adc_clk_init);
    37. }
    38. }
    39. /* 获得ADC转换后的结果函数 */
    40. uint32_t adc_get_result(void)
    41. {
    42. HAL_ADC_Start(&g_adc_handle);
    43. HAL_ADC_PollForConversion(&g_adc_handle, 10);
    44. return (uint16_t)HAL_ADC_GetValue(&g_adc_handle);
    45. }
    46. /* 读取光敏传感器值 */
    47. uint8_t lsens_get_val(void)
    48. {
    49. uint32_t temp_val;
    50. temp_val = adc_get_result();
    51. temp_val /= 40; /*把转换到的数字量转换为0 ~ 100 之间的数*/
    52. if (temp_val > 100) temp_val = 100;
    53. return (uint8_t)(100 - temp_val); /*光强与转化值为负相关 光强越大电压越小*/
    54. }

    adc.h

    1. #ifndef __ADC_H
    2. #define __ADC_H
    3. #include "./SYSTEM/sys/sys.h"
    4. void adc3_init(void);
    5. uint32_t adc_get_result(void);
    6. uint8_t lsens_get_val(void);
    7. #endif

    main.c

    1. #include "./SYSTEM/sys/sys.h"
    2. #include "./SYSTEM/usart/usart.h"
    3. #include "./SYSTEM/delay/delay.h"
    4. #include "./USMART/usmart.h"
    5. #include "./BSP/LED/led.h"
    6. #include "./BSP/LCD/lcd.h"
    7. #include "./BSP/ADC/adc3.h"
    8. int main(void)
    9. {
    10. short adcx;
    11. HAL_Init(); /* 初始化HAL库 */
    12. sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    13. delay_init(72); /* 延时初始化 */
    14. usart_init(115200); /* 串口初始化为115200 */
    15. led_init(); /* 初始化LED */
    16. lcd_init(); /* 初始化LCD */
    17. adc3_init(); /* 初始化ADC3 */
    18. lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
    19. lcd_show_string(30, 70, 200, 16, 16, "LSENS TEST", RED);
    20. lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
    21. lcd_show_string(30, 110, 200, 16, 16, "LSENS_VAL:", BLUE);
    22. while (1)
    23. {
    24. adcx = lsens_get_val();
    25. lcd_show_xnum(30 + 10 * 8, 110, adcx, 3, 16, 0, BLUE); /* 显示ADC的值 */
    26. LED0_TOGGLE(); /* LED0闪烁,提示程序运行 */
    27. delay_ms(250);
    28. }
    29. }

  • 相关阅读:
    ant design pro v5 之统一错误处理
    js的promise用法
    Python的基础语法
    Random与random的区别
    C++构造函数
    快团团对接,供货商对接团长如何做到只吸引不打扰?
    数据新增的常用方法(es6-es12)-今天一定要学会
    Spring Cloud 网关的配置示例
    java--并发
    TIPC messaging3
  • 原文地址:https://blog.csdn.net/2302_79878697/article/details/138083323