侧边栏壁纸
    • 累计撰写 302 篇文章
    • 累计收到 527 条评论
    【10】基于STM32CubeMX-STM32ADC与OLED开发
    我的学记|刘航宇的博客

    【10】基于STM32CubeMX-STM32ADC与OLED开发

    刘航宇
    2022-01-31 / 0 评论 / 848 阅读 / 正在检测是否收录...

    目录

    实训案例:ADC与OLED综合训练

    在XMF07A或XMF07C开发板上,利用STM32CubeMX和Keil5协同开发,完成以下的功能:
    【1】 上电开机后,首选在OLED上显示“强国图志”图片,然后让LED1与LED2依次点亮,然后熄灭,进行灯光检测。灯光检测结束后,OLED切换至数据显示界面,分3行:
    第1行显示:“ sciarm.com ”
    第2行显示:“采样值:”
    第3行显示:“电压值:”
    【2】在主程序中,采用查询的方式,每隔0.3秒对ADC_IN0通道的光敏传感器进行一次电压数据采集,并将采样到的12位数据换算成对应的实际电压值。LED1作为A/D采样指示灯,每采样一次闪烁一下。
    【3】每进行完一次光敏传感器的数据采样和电压换算后,将其结果更新到OLED显示屏中相应的位置。如果光敏传感器的电压值小于1.3V,则将LED2灯点亮,反之,将LED2灯关闭。

    //首先需要进行OLED的底层驱动函数移植,生成相应的文字和图片数据
    /* USER CODE BEGIN Includes */
    //====引入OLED底层驱动的头文件========
    #include "XMF_OLED_STM32Cube.h"
    #include "stdio.h"
    /* USER CODE END Includes */
    extern unsigned char BMP1[];
    
    #define LED1_ON() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET)
    #define LED2_ON() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_SET)
    #define LED1_OFF() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_RESET)
    #define LED2_OFF() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_RESET)
    
    uint16_t ADC0_Value = 0;
    uint16_t ADC_Volt = 0;
    uint8_t str_buff[64];
    //LED灯流水点亮检测
    void LED_Check()
    {
        LED1_ON();
        HAL_Delay(500);
        LED2_ON();
        HAL_Delay(500);
        
        LED1_OFF();
        HAL_Delay(500);
        LED2_OFF();
        HAL_Delay(500);
    }
    //显示开机LOGO图片
    void OLED_display_pic()
    {
        OLED_Clear();
        OLED_DrawBMP(0,0,128,8,BMP1);
    }
    //显示数据显示界面
    void OLED_display_info()
    {
        OLED_Clear();
        OLED_ShowString(6,0,(uint8_t *)"sciarm.com");
        HAL_Delay(200);
        OLED_ShowCHinese(0,3,24); 
        OLED_ShowCHinese(18,3,25); 
        OLED_ShowCHinese(36,3,26); 
        OLED_ShowString(54,3,(uint8_t *)":");
        HAL_Delay(200);
        OLED_ShowCHinese(0,6,16); 
        OLED_ShowCHinese(18,6,17); 
        OLED_ShowCHinese(36,6,26); 
        OLED_ShowString(54,6,(uint8_t *)":");
        HAL_Delay(200);
    }
    //更新ADC采样数据与换算结果
    void OLED_display_dat()
    {
        sprintf((char*)str_buff, "%4d", ADC0_Value);
        OLED_ShowString(64,3,(uint8_t *)str_buff);
        sprintf((char*)str_buff, "%d.%d%dV", ADC_Volt/100, (ADC_Volt%100/10), ADC_Volt%10);
        OLED_ShowString(64,6,(uint8_t *)str_buff);
    }
    //ADC采样过程与灯光自动控制
    void Get_ADC0_Value()
    {
        HAL_ADC_Start(&hadc1);
        if(HAL_OK == HAL_ADC_PollForConversion(&hadc1, 30))
        {
            ADC0_Value = HAL_ADC_GetValue(&hadc1);
            ADC_Volt = ADC0_Value * 330 / 4096; 
            
            if(ADC_Volt < 130)
            {
            LED2_ON();
            }
            else
            {
            LED2_OFF();
            }
        }
        HAL_ADC_Stop(&hadc1);
    }
    /* USER CODE BEGIN 2 */
    OLED_Init();            //初始化OLED
    OLED_display_pic();        //显示开机LOGO图片
    LED_Check();            //灯光检测
    OLED_display_info();        //显示数据界面
    /* USER CODE END 2 */
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
        LED1_ON();            //ADC采样指示灯点亮
        Get_ADC0_Value();        //进行一次ADC采样及逻辑处理
        OLED_display_dat();        //更新OLED中的采样数据
        HAL_Delay(200);        //延时0.2秒
        LED1_OFF();            //ADC采样指示灯关闭
    /* USER CODE END WHILE */
    
    /* USER CODE BEGIN 3 */
    }
    /* USER CODE END 3 */
    13
    HAL_STM32_DS18B20开发
    « 上一篇 2022-02-03
    【9】基于STM32CubeMX-STM32OLED开发
    下一篇 » 2022-01-29

    评论 (0)

    取消