[MCU] 【上海航芯 ACM32F070开发板+触控功能评估板】电压计实现与ADC性能粗测

qinyunti   2022-9-26 23:28 楼主

电压计

 

前言

    本次基于ADC和段码显示,实现一个电压计的功能。

过程

基于LCD_TK进行。

使用上4位数显示,单位mV。

从原理图查看,使用未被占用的ADC输入通道,PA7 ADC4。

 

将HAL_ADC.c添加到工程。

 

App.c如下

/*

  ******************************************************************************

  * @File    APP.c

  * @author  CWT

  * @version V1.0.0

  * @date    2020

  * @brief   LCD demo source code.

  ******************************************************************************

*/

#include "APP.h"

#include "SHT30.h"

#include "lcd_GDC04212.h"

#include "lcd_GDC03828.h"

#include "lcd_YR1618A.h"

#include "buzzer.h"

#include "TKEY.h"

 

LCD_HandleTypeDef         *lcdhandle;  //LCD HandleÖ¸Õë

 

I2C_HandleTypeDef I2C_Handle;   //I2C HandleÖ¸Õë

 

#define BUFFER_LENGTH    (256)

uint8_t gu8_TxBuffer[BUFFER_LENGTH];

uint8_t gu8_RxBuffer[BUFFER_LENGTH];

 

uint8_t gu8_time_count_free = 0;//0-free,1-0.5s,2-1s,

uint32_t gu32_time_1s_cont = 0;

 

extern volatile uint32_t gu32_SystemCount;

 

 

void(*LCD_DisplayNum)(uint32_t);//LCDÏÔʾº¯ÊýÖ¸Õë

 

void(*LCD_Init)(void);//LCD³õʼ»¯º¯ÊýÖ¸Õë

 

extern void (*SysTick_Handler_Callback)(void);

 

extern LCD_HandleTypeDef         lcdhandle_GDC04212;

extern LCD_HandleTypeDef         lcdhandle_GDC03828;

extern LCD_HandleTypeDef         lcdhandle_YR1618A;

 

TIM_HandleTypeDef TIM6_Handler;  

 

DMA_HandleTypeDef  DMA_CH1_Handle;

 

DMA_LLI_InitTypeDef DMA_CH1_Handle_link1;

DMA_LLI_InitTypeDef DMA_CH1_Handle_link2;

DMA_LLI_InitTypeDef DMA_CH1_Handle_link3;

DMA_LLI_InitTypeDef DMA_CH1_Handle_link4;

DMA_LLI_InitTypeDef DMA_CH1_Handle_link5;

DMA_LLI_InitTypeDef DMA_CH1_Handle_link6;

DMA_LLI_InitTypeDef DMA_CH1_Handle_link7;

DMA_LLI_InitTypeDef DMA_CH1_Handle_link8;

DMA_LLI_InitTypeDef DMA_CH1_Handle_link9;

 

 

#if defined LCD_GDC04212 //¶ÔÓ¦GDC04212µÄ9Ö¡Êý¾Ý£¬·Ö±ðÏÔʾΪ¡°1111¡±-"9999"

uint32_t wdata1[16]={0x06000600,0x06000600,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata2[16]={0x0B060B06,0x0B060B06,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata3[16]={0xF020F02,0xF020F02,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata4[16]={0x06030603,0x06030603,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata5[16]={0xD030D03,0xD030D03,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata6[16]={0x0D070D07,0x0D070D07,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata7[16]={0x07000700,0x07000700,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata8[16]={0x0F070F07,0x0F070F07,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata9[16]={0xF030F03,0xF030F03,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

#elif defined LCD_GDC03828 //¶ÔÓ¦GDC03828µÄ9Ö¡Êý¾Ý£¬·Ö±ðÏÔʾΪ¡°1111¡±-"9999"

uint32_t wdata1[16]={0x06000600,0x06000600,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata2[16]={0x0B060B06,0x0B060B06,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata3[16]={0xF020F02,0xF020F02,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata4[16]={0x06030603,0x06030603,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata5[16]={0xD030D03,0xD030D03,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata6[16]={0x0D070D07,0x0D070D07,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata7[16]={0x07000700,0x07000700,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata8[16]={0x0F070F07,0x0F070F07,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata9[16]={0xF030F03,0xF030F03,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

#else//¶ÔÓ¦YR1618AµÄ9Ö¡Êý¾Ý£¬·Ö±ðÏÔʾΪ¡°1111¡±-"9999"

uint32_t wdata1[16]={0x06C8E0FF,0x02488055,0x06C8E0FF,0x02488055,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata2[16]={0x048060AA,0x00000000,0x048060AA,0x00000000,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata3[16]={0x06C8E0FF,0x048060AA,0x02488055,0x02488055,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata4[16]={0x06C8E0FF,0x048060AA,0x048060AA,0x02488055,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata5[16]={0x048060AA,0x06C8E0FF,0x048060AA,0x00000000,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata6[16]={0x02488055,0x06C8E0FF,0x048060AA,0x02488055,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata7[16]={0x02488055,0x06C8E0FF,0x06C8E0FF,0x02488055,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata8[16]={0x06C8E0FF,0x00000000,0x048060AA,0x00000000,0,0,0,0,0,0,0,0,0,0,0,0};

uint32_t wdata9[16]={0x06C8E0FF,0x06C8E0FF,0x06C8E0FF,0x02488055,0,0,0,0,0,0,0,0,0,0,0,0};

#endif

 

EXTI_HandleTypeDef EXTI_Line13_Handle;

 

GPIO_InitTypeDef GPIO_PC13_Handle;

/*********************************************************************************

* Function    : LCD_IRQHandler

* Description : LCD Interrupt handler

* Input       :

* Outpu       :

* Author      : CWT                         Data : 2021Äê

**********************************************************************************/

void LCD_IRQHandler(void)

{

    HAL_LCD_IRQHandler(lcdhandle);

  

}

/*********************************************************************************

* Function    : DMA_IRQHandler

* Description : DMA Interrupt handler

* Input       :

* Outpu       :

* Author      : CWT                         Data : 2021Äê

**********************************************************************************/

void DMA_IRQHandler(void)

{

    HAL_DMA_IRQHandler(&DMA_CH1_Handle);

}

/************************************************************************

 * function   : HAL_I2C_MspInit

 * Description:

 * input      : hi2c : pointer to a I2C_HandleTypeDef structure that contains

 *                     the configuration information for I2C module

 ************************************************************************/

void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)

{

    /*

      NOTE : This function should be modified by the user.

    */

    

    /* For Example */

    GPIO_InitTypeDef GPIO_Handle;

    

    /* I2C1 */

 

    /* I2C2 */

    if (hi2c->Instance == I2C2)

    {

        System_Module_Enable(EN_I2C2);  

        System_Module_Enable(EN_GPIOCD);   

 

        /* I2C2 SDA  PortD Pin7 */

        /* I2C2 SCL  PortD Pin6 */

        GPIO_Handle.Pin            = GPIO_PIN_6 | GPIO_PIN_7;

        GPIO_Handle.Mode           = GPIO_MODE_AF_PP;

        GPIO_Handle.Pull           = GPIO_PULLUP;

        GPIO_Handle.Alternate      = GPIO_FUNCTION_1;

        HAL_GPIO_Init(GPIOD, &GPIO_Handle);

        

        /* Clear Pending Interrupt */

        NVIC_ClearPendingIRQ(I2C2_IRQn);

        

        /* Enable External Interrupt */

        NVIC_EnableIRQ(I2C2_IRQn);

    }

}

/************************************************************************

 * function   : I2C_Init

 * Description: I2C Initiation.

* Input       :

* Outpu       :

* Author      : ZK                         Data : 2022Äê

 ************************************************************************/

void I2C_Init(void)

{

    

    I2C_Handle.Instance         = I2C2;

    I2C_Handle.Init.I2C_Mode    = I2C_MODE_MASTER;

    I2C_Handle.Init.Tx_Auto_En  = TX_AUTO_EN_ENABLE;

    I2C_Handle.Init.Clock_Speed = CLOCK_SPEED_STANDARD;  

    I2C_Handle.Init.No_Stretch_Mode = NO_STRETCH_MODE_NOSTRETCH;   

    

    HAL_I2C_Init(&I2C_Handle);

}

/************************************************************************

 * function   : SHT30_Read_Result

 * Description: get SHT30 result

* Input       :

* Outpu       :

* Author      : ZK                         Data : 2022Äê

 ************************************************************************/

void SHT30_Read_Result(uint8_t *sht30_data,float *getTempHum)

{

uint16_t tem,hum;

float Temperature=0;

float Humidity=0;

    tem = ((sht30_data[0]<<8) | sht30_data[1]);//ζÈÆ´½Ó

    hum = ((sht30_data[3]<<8) | sht30_data[4]);//ʪ¶ÈÆ´½Ó

    

    /*ת»»Êµ¼ÊζÈ*/

    Temperature= (175.0*(float)tem/65535.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)

    Humidity= (100.0*(float)hum/65535.0);// RH = hum*100 / (2^16-1)

    

//    if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//¹ýÂË´íÎóÊý¾Ý

//    {

//        printfS("%6.2f*C %6.2f%%",Temperature,Humidity);//111.01*C 100.01%£¨±£Áô2λСÊý£©

//    }

    getTempHum[0]=Temperature;

    getTempHum[1]=Humidity;

}

/************************************************************************

 * function   : SHT30_Init

 * Description: SHT30 Initiation.

* Input       :

* Outpu       :

* Author      : ZK                         Data : 2022Äê

 ************************************************************************/

void SHT30_Init(void)

{

    I2C_Init();

    SHT30_Reset(I2C_Handle);

}

/*********************************************************************************

* Function    : LCD_Config

* Description : Config LCD

* Input       :

* Outpu       :

* Author      : CWT                         Data : 2021Äê

**********************************************************************************/

void LCD_Config(void)

{   

    

    #if defined LCD_GDC04212

        LCD_DisplayNum=LCD_DisplayNum_GDC04212;

        LCD_Init=LCD_Init_GDC04212;

        lcdhandle=&lcdhandle_GDC04212;

 

    #elif defined LCD_GDC03828

        LCD_DisplayNum=LCD_DisplayNum_GDC003828;

        LCD_Init=LCD_Init_GDC03828;

        lcdhandle=&lcdhandle_GDC03828;

 

    #else

        LCD_DisplayNum=LCD_DisplayNum_YR1618A;

        LCD_Init=LCD_Init_YR1618A;

        lcdhandle=&lcdhandle_YR1618A;

        

 

    #endif  

        LCD_Init();

        LCD_BACK_LED();

}

 

/*********************************************************************************

* Function    : LCD_DisplayTest

* Description : LCD DisplayTest

* Input       :

* Outpu       :

* Author      : ZK                         Data : 2022Äê

**********************************************************************************/

void LCD_DisplayTest()

{

    while(1)

    {

        #ifdef LCD_YR1618A

        LCD_YR1618A_SelfDisplay();

        #else

        for(uint16_t i=0;i<10000;i++)   

        {

            LCD_DisplayNum(i);

            System_Delay_MS(100);

        }  

        #endif

    }

}

void EXTI_IRQHandler(void)

{

    HAL_EXTI_IRQHandler(&EXTI_Line13_Handle);

}

 

/*********************************************************************************

* Function    : LCD_Sleep_DMA_Test

* Description : LCD Display in sleep,use DMA to Reresh data to LCDRAM

* Input       :

* Outpu       :

* Author      : CWT                         Data : 2021Äê

**********************************************************************************/

void LCD_Sleep_DMA_Test()/*SleepģʽÏÂÓÃDMA½øÐÐÑ­»·ÏÔʾ*/

{   

    memset(&DMA_CH1_Handle,0,sizeof(DMA_CH1_Handle));//³õʼ»¯ÇåÁãHandle

    //DMAÅäÖÃ

    DMA_CH1_Handle.Instance              = DMA_Channel0;

    DMA_CH1_Handle.Init.Data_Flow        = DMA_DATA_FLOW_M2P;

    DMA_CH1_Handle.Init.Request_ID       = REQ22_TIM3_CH2_LCDFRAME;

    DMA_CH1_Handle.Init.Source_Inc       = DMA_SOURCE_ADDR_INCREASE_ENABLE;

    DMA_CH1_Handle.Init.Desination_Inc   = DMA_DST_ADDR_INCREASE_ENABLE;

    DMA_CH1_Handle.Init.Source_Width     = DMA_SRC_WIDTH_WORD;

    DMA_CH1_Handle.Init.Desination_Width = DMA_DST_WIDTH_WORD;

    HAL_DMA_Init(&DMA_CH1_Handle);

    

    DMA_CH1_Handle.Instance->CTRL &= ~DMA_CHANNEL_CTRL_ITC;//¹Ø±ÕÁ´±íÍê³ÉÖжϣ¬·ñÔòSleepģʽÏ£¬°áÔËÍæÁ´±í1Ôò²úÉúÖжϻ½ÐÑSleep

    

    //DMAÁ´±íÅäÖÃ1

    DMA_CH1_Handle_link1.SrcAddr = (uint32_t)(wdata1);

    DMA_CH1_Handle_link1.DstAddr = (uint32_t)(&lcdhandle->Instance->LCD_RAM[0]);

    DMA_CH1_Handle_link1.Next = &DMA_CH1_Handle_link2;

    DMA_CH1_Handle_link1.Control = DMA_CH1_Handle.Instance->CTRL | 16;

    

    //DMAÁ´±íÅäÖÃ2

    DMA_CH1_Handle_link2.SrcAddr = (uint32_t)(wdata2);

    DMA_CH1_Handle_link2.DstAddr = (uint32_t)(&lcdhandle->Instance->LCD_RAM[0]);

    DMA_CH1_Handle_link2.Next = &DMA_CH1_Handle_link3;

    DMA_CH1_Handle_link2.Control = DMA_CH1_Handle.Instance->CTRL | 16;

    

    //DMAÁ´±íÅäÖÃ3

    DMA_CH1_Handle_link3.SrcAddr = (uint32_t)(wdata3);

    DMA_CH1_Handle_link3.DstAddr = (uint32_t)(&lcdhandle->Instance->LCD_RAM[0]);

    DMA_CH1_Handle_link3.Next = &DMA_CH1_Handle_link4;

    DMA_CH1_Handle_link3.Control = DMA_CH1_Handle.Instance->CTRL | 16;

 

    //DMAÁ´±íÅäÖÃ4

    DMA_CH1_Handle_link4.SrcAddr = (uint32_t)(wdata4);

    DMA_CH1_Handle_link4.DstAddr = (uint32_t)(&lcdhandle->Instance->LCD_RAM[0]);

    DMA_CH1_Handle_link4.Next = &DMA_CH1_Handle_link5;

    DMA_CH1_Handle_link4.Control = DMA_CH1_Handle.Instance->CTRL | 16;

    //DMAÁ´±íÅäÖÃ5

    DMA_CH1_Handle_link5.SrcAddr = (uint32_t)(wdata5);

    DMA_CH1_Handle_link5.DstAddr = (uint32_t)(&lcdhandle->Instance->LCD_RAM[0]);

    DMA_CH1_Handle_link5.Next = &DMA_CH1_Handle_link6;

    DMA_CH1_Handle_link5.Control = DMA_CH1_Handle.Instance->CTRL | 16;

    

    //DMAÁ´±íÅäÖÃ6

    DMA_CH1_Handle_link6.SrcAddr = (uint32_t)(wdata6);

    DMA_CH1_Handle_link6.DstAddr = (uint32_t)(&lcdhandle->Instance->LCD_RAM[0]);

    DMA_CH1_Handle_link6.Next = &DMA_CH1_Handle_link7;

    DMA_CH1_Handle_link6.Control = DMA_CH1_Handle.Instance->CTRL | 16;

    

    //DMAÁ´±íÅäÖÃ7

    DMA_CH1_Handle_link7.SrcAddr = (uint32_t)(wdata7);

    DMA_CH1_Handle_link7.DstAddr = (uint32_t)(&lcdhandle->Instance->LCD_RAM[0]);

    DMA_CH1_Handle_link7.Next =  &DMA_CH1_Handle_link8;

    DMA_CH1_Handle_link7.Control = DMA_CH1_Handle.Instance->CTRL | 16;

 

    //DMAÁ´±íÅäÖÃ8

    DMA_CH1_Handle_link8.SrcAddr = (uint32_t)(wdata8);

    DMA_CH1_Handle_link8.DstAddr = (uint32_t)(&lcdhandle->Instance->LCD_RAM[0]);

    DMA_CH1_Handle_link8.Next = &DMA_CH1_Handle_link9;

    DMA_CH1_Handle_link8.Control = DMA_CH1_Handle.Instance->CTRL | 16;

    //DMAÁ´±íÅäÖÃ9

    DMA_CH1_Handle_link9.SrcAddr = (uint32_t)(wdata9);

    DMA_CH1_Handle_link9.DstAddr = (uint32_t)(&lcdhandle->Instance->LCD_RAM[0]);

    DMA_CH1_Handle_link9.Next = NULL;

    //×îºóÒ»´Î´«Ê俪ÆôÁ´±íÍê³ÉÖжϣ¬ÓÃÓÚ»½ÐÑLCD£¬Ò²¿É¸ù¾ÝÐèÒª£¬Ö¸ÏòÁ´±í1Ñ­»·ÏÔʾ

    DMA_CH1_Handle_link9.Control = DMA_CH1_Handle.Instance->CTRL | 16|(DMA_CHANNEL_CTRL_ITC);

    

    /*Á´±íÅäÖÃÍê³É£¬ÉèÖÃDMAµÄÁ´±íµØַΪÁ´±í1£¬¿ªÊ¼DMA´«Êä*/

    DMA_CH1_Handle.Instance->LLI =(uint32_t)&DMA_CH1_Handle_link1;  

    __HAL_LINK_DMA((*lcdhandle), DMA_Handle, DMA_CH1_Handle);

    HAL_LCD_Start_DMA(lcdhandle, wdata1, 16);

    

    /*½øÈëSleepÇ°ÐèÒª¹Ø±ÕSystickºÍLCDÖжϣ¬·ñÔòÒ»½øÈëSleep¾Í±»»½ÐÑ*/

    SysTick->CTRL = 0;

    lcdhandle->Instance->CR1 &= ~LCD_CR1_IE;

    System_Enter_Sleep_Mode(SLEEPENTRY_WFI);//½øÈësleep

    

    /*°áÔËÍê³É£¬Í˳öSleep£¬ÏÔʾ1234*/

    LCD_DisplayNum(1234);

}

 

/*********************************************************************************

* Function    : Exit_Config

* Description : Exit_Config

* Input       :

* Outpu       :

* Author      : ZK                         Data : 2022Äê

**********************************************************************************/

void Exit_Config(void)

{    

    /* Initialization GPIO */

 

    /* RTC access enable */

    System_Enable_Disable_RTC_Domain_Access(FUNC_ENABLE);

    

    __HAL_RTC_PC13_SEL(0);  // GPIO function    

    __HAL_RTC_PC13_PULL_UP_ENABLE();

    __HAL_RTC_PC13_DIGIT();

  

    System_Module_Enable(EN_EXTI);

    /* Config EXTI */

    EXTI_Line13_Handle.u32_Line    = EXTI_LINE_13;

    EXTI_Line13_Handle.u32_Mode    = EXTI_MODE_INTERRUPT;

    EXTI_Line13_Handle.u32_Trigger = EXTI_TRIGGER_FALLING;

    EXTI_Line13_Handle.u32_GPIOSel = EXTI_GPIOC;

    HAL_EXTI_SetConfigLine(&EXTI_Line13_Handle);

}

 

 

/*********************************************************************************

* Function    : LCD_StopTest

* Description : LCD Dispaly in Stop

* Input       :

* Outpu       :

* Author      : CWT                         Data : 2021Äê

**********************************************************************************/

void LCD_StopTest()/*StopģʽÏÂÏÔʾ*/

{   

    LCD_DisplayNum(6666);

    

    Exit_Config();

    HAL_EXTI_ClearAllPending();

    System_Delay_MS(2000);

    System_Enter_Stop_Mode(STOPENTRY_WFI);//½øÈëSTOP£¬²»»½ÐÑ£¬²é¿´ÊÇ·ñÕý³£ÏÔʾ

    

    LCD_DisplayNum(8888);/*»½ÐÑ£¬ÈôÍ˳öStop£¬ÔòÏÔʾ8888*/

}

 

 

/*********************************************************************************

* Function    : LCD_Test

* Description : LCD Test

* Input       :

* Outpu       :

* Author      : CWT                         Data : 2021Äê

**********************************************************************************/

void LCD_Test(enum_TEST_MODE_t fe_Mode)

{    

    switch (fe_Mode)

    {

        /* Õý³£ÏÔʾģʽ */

        case TEST_Dispaly_Normal:

        {

            LCD_DisplayTest();

        }

        

        /* StopģʽÏÔʾ */

        case TEST_Dispaly_InStop:

        {

            LCD_StopTest();

            while(1)

            {

 

            }

        }

    

        /* Sleepģʽ+DMA´«Êä+»½ÐÑÏÔʾ*/

        case TEST_Dispaly_Sleep_DMA:

        {

            LCD_Sleep_DMA_Test();

            while(1)

            {

 

            }

        }

        default: break;

    }

}

 

/*********************************************************************************

* Function    : Get_Touch_Key_Value

* Description : get key value

* Input       :

* Output      : key value

* Author      : LWQ                         Data : 2022Äê

**********************************************************************************/

uint8_t Get_Touch_Key_Value(void)

{

    static uint8_t key_flags = NO_KEY_DOWN;            /* ÊÇ·ñÓа´¼ü°´ÏµıêÖ¾±äÁ¿ */

    static uint32_t key_value = 0;

    uint8_t i=0, key_num = 0;

    uint32_t uwTouchBits = 0;

    uint32_t uwTouchBits_ref = 0;

    uint32_t uwkey_value = 0;

    uint8_t  ucKey = 0;

 

    uwTouchBits = TK_GetPressRelaeseFlag();

    uwTouchBits_ref = uwTouchBits;

    uwkey_value = key_value;

 

    for(i = 0; i < MAX_KEY_NUM; i++)

    {

        uwTouchBits &= (~key_value);

        if((uwTouchBits >> i) & 0x0001)

        {

            key_num++;

        }

    }

 

    if(key_flags == NO_KEY_DOWN)

    {

        if(key_num == 1)

        {

            key_flags = KEY_DOWN;

        }

    }

    else if((key_value & uwTouchBits) == 0)

    {

        if(key_value != uwTouchBits_ref)

        {

            key_flags = NO_KEY_DOWN;

            key_value = 0;

        }

 

        if(key_num == 1)

        {

            key_flags = OTHER_KEY_DOWN;

        }

    }

 

    if(key_flags != NO_KEY_DOWN)

    {

        if(key_num == 1 && (key_value & uwTouchBits) == 0)

        {

            for(i = 0; i < MAX_KEY_NUM; i++)

            {

                if((key_num == 1) && ((uwTouchBits >> i) & 0x0001))//Åжϰ´¼üÖµ

                {                                      

                    if((uwkey_value & uwTouchBits_ref) == 0)

                    {

                        key_value = uwTouchBits;

                        ucKey = i;

                        printfS("TK_%d\r\n", i);

                    }

                    else

                    {

                        key_value = uwkey_value;

                    }

 

                }

            }

        }

    }

    if(ucKey != 0)//È·ÈÏÊÇ°´Ï£¨²»ÊÇ̧ÊÖ£©

    {

        Beep_On(5);

    }         

 

    return ucKey;

}

 

void SysTick_Callback(void)

{

    if(gu8_time_count_free==0)

    {

        if(gu32_time_1s_cont==400)

        {

            gu8_time_count_free=2;

            gu32_time_1s_cont=0;

        }

        else if(gu32_time_1s_cont==200)

        {

            gu8_time_count_free=1;

            gu32_time_1s_cont++;

        }

        else

        {

            gu32_time_1s_cont++;

        }

    }

}

 

ADC_HandleTypeDef ADC_Handle;

/************************************************************************

 * function   : ADC_GetVrefP

 * Description: ADC Get The VrefP Value.

 * input      : Pre_Channel:Can be ADC_CHANNEL_2 ADC_CHANNEL_8 ADC_CHANNEL_10

 ************************************************************************/

uint32_t ADC_GetVrefP(uint8_t Pre_Channel)

{

    ADC_ChannelConfTypeDef ADC_ChannelConf;

    uint32_t TrimValue_3v, AdcValue_VrefP[2], VrefP,temp;

    

    ADC_Handle.Init.ClockDiv = ADC_CLOCK_DIV8;

    ADC_Handle.Init.ConConvMode = ADC_CONCONVMODE_DISABLE;

    ADC_Handle.Init.JChannelMode = ADC_JCHANNELMODE_DISABLE;

    ADC_Handle.Init.DiffMode = ADC_DIFFMODE_DISABLE;

    ADC_Handle.Init.DMAMode = ADC_DMAMODE_DISABLE;

    ADC_Handle.Init.OverMode = ADC_OVERMODE_DISABLE;

    ADC_Handle.Init.OverSampMode = ADC_OVERSAMPMODE_DISABLE;

    ADC_Handle.Init.AnalogWDGEn = ADC_ANALOGWDGEN_DISABLE;

    ADC_Handle.Init.ExTrigMode.ExTrigSel = ADC_SOFTWARE_START;

    ADC_Handle.Init.ChannelEn = ADC_CHANNEL_VBGR_EN;

 

    ADC_Handle.Instance = ADC;

        

    HAL_ADC_Init(&ADC_Handle);

 

    /* The total adc regular channels number */

    ADC_Handle.ChannelNum = 2;

    

     /* Add adc channels */

    ADC_ChannelConf.Channel = Pre_Channel;

    ADC_ChannelConf.RjMode = 0;

    ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ1;

    ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;    

    HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);

    

    /* Add adc channels */

    ADC_ChannelConf.Channel = ADC_CHANNEL_VBGR;

    ADC_ChannelConf.RjMode = 0;

    ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ2;

    ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;    

    HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);

    

    HAL_ADC_Polling(&ADC_Handle, AdcValue_VrefP, ADC_Handle.ChannelNum, 0);

    

    printfS("The adc convert result : Channel 18 = 0x%08x \r\n", AdcValue_VrefP[1]);

    

    TrimValue_3v = *(volatile uint32_t*)(0x00080240); //Read the 1.2v trim value in 3.0v vrefp.

 

    printfS("The adc 1.2v trim value is : 0x%08x \r\n", TrimValue_3v);

 

    if(((~TrimValue_3v&0xFFFF0000)>>16) == (TrimValue_3v&0x0000FFFF))

    {

        temp = TrimValue_3v & 0xFFF;

        

        VrefP = (uint32_t)(temp * 3000 / (AdcValue_VrefP[1] & 0xFFF));

                

        return VrefP;

    }

    else

        return 0;

}

 

void App_Test(void)

{   

    float ff_getTempHum[2];

    uint16_t fu16_num_up, fu16_num_down;

    uint32_t fu32_Displayup[4]={0},fu32_Displaydown[4]={0},fu32_num_123567p[7]={0},fu32_num_col[2]={0},fu32_num_s=0;

    uint8_t  fu8_Tkey_state = 0xff, fu8_Work_Mode=0;

    uint16_t fu16_set_num_up=0,fu16_set_num_down=0;

    uint8_t  fu8_Hidden_point=0;//Òþ²Øµã

    uint8_t  ret = 0;

    

    LCD_Config();  

    

    SHT30_Init();

 

    BUZZER_Init();

    

    ret = TouchKey_Init();

    if(ret)

    {

        printfS("TouchKey_Init is Fail!\r\n");

    }

    else

    {

        printfS("TouchKey_Init is Success!\r\n");      

    }

    

    LCD_YR1618A_SelfDisplay();

uint32_t VrefP;

uint32_t Voltage;

    SysTick_Handler_Callback = SysTick_Callback;

VrefP = ADC_GetVrefP(ADC_CHANNEL_8);

 

    ADC_ChannelConfTypeDef ADC_ChannelConf;

    

    ADC_Handle.Init.ClockDiv = ADC_CLOCK_DIV8;

    ADC_Handle.Init.ConConvMode = ADC_CONCONVMODE_DISABLE;

    ADC_Handle.Init.JChannelMode = ADC_JCHANNELMODE_DISABLE;

    ADC_Handle.Init.DiffMode = ADC_DIFFMODE_DISABLE;

    ADC_Handle.Init.DMAMode = ADC_DMAMODE_DISABLE;

    ADC_Handle.Init.OverMode = ADC_OVERMODE_DISABLE;

    ADC_Handle.Init.OverSampMode = ADC_OVERSAMPMODE_DISABLE;

    ADC_Handle.Init.AnalogWDGEn = ADC_ANALOGWDGEN_DISABLE;

    ADC_Handle.Init.ExTrigMode.ExTrigSel = ADC_SOFTWARE_START;

    ADC_Handle.Init.ChannelEn = ADC_CHANNEL_4_EN;

 

    ADC_Handle.Instance = ADC;

        

    HAL_ADC_Init(&ADC_Handle);

 

    /* The total adc regular channels number */

    ADC_Handle.ChannelNum = 1;

    

    /* Add adc channels */

    ADC_ChannelConf.Channel = ADC_CHANNEL_4;

    ADC_ChannelConf.RjMode = 0;

    ADC_ChannelConf.Sq = ADC_SEQUENCE_SQ1;

    ADC_ChannelConf.Smp = ADC_SMP_CLOCK_320;   

    HAL_ADC_ConfigChannel(&ADC_Handle,&ADC_ChannelConf);

    uint32_t AdcValue_VrefP[1];

    while(1)

    {

        fu8_Tkey_state = TK_TimerSacn_GetKeyVal();//Get_Touch_Key_Value();

        if(fu8_Tkey_state != 0xFF)

        {

            Beep_On(5);

        #ifndef TKEY_WAVEFORM_OUTPUT

            printfS("TK_%d\r\n", fu8_Tkey_state);

        #endif

        }

        TKEY_Calibrate_Process();

 

HAL_ADC_Polling(&ADC_Handle, AdcValue_VrefP, ADC_Handle.ChannelNum, 0);

Voltage = (AdcValue_VrefP[0]&0xFFF)*VrefP/4095;

        if(Voltage>9999) Voltage=9999;//4λÊý£¬×î´óÏÔʾ9999

        fu32_Displayup[0]=Voltage/1000%10;//ǧλ,LCDµÚ1¸öλÖÃ(´Ó×óµ½ÓÒ)--5

        fu32_Displayup[1]=Voltage/100%10;//°×λ,LCDµÚ2¸öλÖÃ(´Ó×óµ½ÓÒ)---6

        fu32_Displayup[2]=Voltage/10%10;//ʮλ,LCDµÚ3¸öλÖÃ(´Ó×óµ½ÓÒ)----7

        fu32_Displayup[3]=Voltage/1%10;//¸öλ,LCDµÚ4¸öλÖÃ(´Ó×óµ½ÓÒ)-----8

  LCD_YR1618A_VIEW(fu32_Displayup,fu32_Displaydown,fu32_num_123567p,fu32_num_col,fu32_num_s);

 

#if 0

        if(fu8_Tkey_state == 10)//µã»÷¡°·µ»Ø¡±£¬Çл»µ½Õý³£Ä£Ê½

        {                

fu16_set_num_up++;

            if(fu16_set_num_up>9999) fu16_set_num_up=9999;//4λÊý£¬×î´óÏÔʾ9999

            fu32_Displayup[0]=fu16_set_num_up/1000%10;//ǧλ,LCDµÚ1¸öλÖÃ(´Ó×óµ½ÓÒ)--5

            fu32_Displayup[1]=fu16_set_num_up/100%10;//°×λ,LCDµÚ2¸öλÖÃ(´Ó×óµ½ÓÒ)---6

            fu32_Displayup[2]=fu16_set_num_up/10%10;//ʮλ,LCDµÚ3¸öλÖÃ(´Ó×óµ½ÓÒ)----7

            fu32_Displayup[3]=fu16_set_num_up/1%10;//¸öλ,LCDµÚ4¸öλÖÃ(´Ó×óµ½ÓÒ)-----8

LCD_YR1618A_VIEW(fu32_Displayup,fu32_Displaydown,fu32_num_123567p,fu32_num_col,fu32_num_s);

        }

if(fu8_Tkey_state == 15)//µã»÷¡°È·ÈÏ¡±£¬Çл»µ½ÉèÖÃģʽ

        {

fu16_set_num_down++;

            if(fu16_set_num_down>9999) fu16_set_num_down=9999;//4λÊý£¬×î´óÏÔʾ9999

            fu32_Displaydown[0]=fu16_set_num_down/1000%10;//ǧλ,LCDµÚ1¸öλÖÃ(´Ó×óµ½ÓÒ)--5

            fu32_Displaydown[1]=fu16_set_num_down/100%10;//°×λ,LCDµÚ2¸öλÖÃ(´Ó×óµ½ÓÒ)---6

            fu32_Displaydown[2]=fu16_set_num_down/10%10;//ʮλ,LCDµÚ3¸öλÖÃ(´Ó×óµ½ÓÒ)----7

            fu32_Displaydown[3]=fu16_set_num_down/1%10;//¸öλ,LCDµÚ4¸öλÖÃ(´Ó×óµ½ÓÒ)-----8

LCD_YR1618A_VIEW(fu32_Displayup,fu32_Displaydown,fu32_num_123567p,fu32_num_col,fu32_num_s);

        }

#endif

 

#if 0

        if(fu8_Work_Mode == 0)//Õý³£Ä£Ê½

        {

if(fu8_Tkey_state == 15)//µã»÷¡°È·ÈÏ¡±£¬Çл»µ½ÉèÖÃģʽ

            {

                fu8_Work_Mode = 1;

            }

 

if(gu8_time_count_free == 1)gu8_time_count_free=0;

            else if(gu8_time_count_free == 2)

{

gu8_time_count_free=0;

SHT30_Read_Dat(I2C_Handle,gu8_RxBuffer);

                SHT30_Read_Result(gu8_RxBuffer,ff_getTempHum);

fu16_num_up=(uint16_t)(ff_getTempHum[0]*100);

fu16_num_down=(uint16_t)(ff_getTempHum[1]*100);

fu32_num_123567p[1] |=1;

fu32_num_123567p[4] |=1;

fu32_num_s |=S_DATA[1];

fu32_num_s |=S_DATA[3];

fu32_num_s &=~S_DATA[0];

fu32_num_s |=S_DATA[12];//S13_BATW,S14_BAT1,S15_BAT2,S16_BAT3

fu32_num_s |=S_DATA[13];

fu32_num_s |=S_DATA[14];

fu32_num_s |=S_DATA[15];

 

if(fu16_num_up>9999) fu16_num_up=9999;//4λÊý£¬×î´óÏÔʾ9999

fu32_Displayup[0]=fu16_num_up/1000%10;//ǧλ,LCDµÚ1¸öλÖÃ(´Ó×óµ½ÓÒ)--5

fu32_Displayup[1]=fu16_num_up/100%10;//°×λ,LCDµÚ2¸öλÖÃ(´Ó×óµ½ÓÒ)---6

fu32_Displayup[2]=fu16_num_up/10%10;//ʮλ,LCDµÚ3¸öλÖÃ(´Ó×óµ½ÓÒ)----7

fu32_Displayup[3]=fu16_num_up/1%10;//¸öλ,LCDµÚ4¸öλÖÃ(´Ó×óµ½ÓÒ)-----8

 

if(fu16_num_down>9999) fu16_num_down=9999;//4λÊý£¬×î´óÏÔʾ9999

fu32_Displaydown[0]=fu16_num_down/1000%10;//ǧλ,LCDµÚ1¸öλÖÃ(´Ó×óµ½ÓÒ)--5

fu32_Displaydown[1]=fu16_num_down/100%10;//°×λ,LCDµÚ2¸öλÖÃ(´Ó×óµ½ÓÒ)---6

fu32_Displaydown[2]=fu16_num_down/10%10;//ʮλ,LCDµÚ3¸öλÖÃ(´Ó×óµ½ÓÒ)----7

fu32_Displaydown[3]=fu16_num_down/1%10;//¸öλ,LCDµÚ4¸öλÖÃ(´Ó×óµ½ÓÒ)-----8

LCD_YR1618A_VIEW(fu32_Displayup,fu32_Displaydown,fu32_num_123567p,fu32_num_col,fu32_num_s);

}

        }

        else //ÉèÖÃģʽ

        {

            if(fu8_Tkey_state == 10)//µã»÷¡°·µ»Ø¡±£¬Çл»µ½Õý³£Ä£Ê½

            {                   

                fu8_Work_Mode = 0;

            }

            else if(fu8_Tkey_state == 7)//¡°×ó¡±

            {

                if(fu8_Hidden_point<7)fu8_Hidden_point++;

            }

            else if(fu8_Tkey_state == 9)//¡°ÓÒ¡±

            {

                if(fu8_Hidden_point>0)fu8_Hidden_point--;

            }

            else if(fu8_Tkey_state == 11)//¡°ÉÏ¡±

            {

                switch(fu8_Hidden_point)

                {

                    case 0:

                        if(fu16_set_num_up<9000)

                        fu16_set_num_up+=1000;

                        break;

                    case 1:

                        fu16_set_num_up+=100;

                        break;

                    case 2:

                        fu16_set_num_up+=10;

                        break;

                    case 3:

                        fu16_set_num_up+=1;

                        break;

                    case 4:

                        if(fu16_set_num_down<9000)

                        fu16_set_num_down+=1000;

                        break;

                    case 5:

                        fu16_set_num_down+=100;

                        break;

                    case 6:

                        fu16_set_num_down+=10;

                        break;

                    case 7:

                        fu16_set_num_down+=1;

                        break;

                };

            }

            else if(fu8_Tkey_state == 8)//¡°Ï¡±

            {

                switch(fu8_Hidden_point)

                {

                    case 0:

                        if(fu16_set_num_up>=1000)

                        fu16_set_num_up-=1000;

                        break;

                    case 1:

                        if(fu16_set_num_up>=100)

                        fu16_set_num_up-=100;

                        break;

                    case 2:

                        if(fu16_set_num_up>=10)

                        fu16_set_num_up-=10;

                        break;

                    case 3:

                        if(fu16_set_num_up>0)

                        fu16_set_num_up-=1;

                        break;

                    case 4:

                        if(fu16_set_num_down>=1000)

                        fu16_set_num_down-=1000;

                        break;

                    case 5:

                        if(fu16_set_num_down>=100)

                        fu16_set_num_down-=100;

                        break;

                    case 6:

                        if(fu16_set_num_down>=10)

                        fu16_set_num_down-=10;

                        break;

                    case 7:

                        if(fu16_set_num_down>0)

                        fu16_set_num_down-=1;

                        break;

                };

            }

        }

        if( (gu8_time_count_free==1) && (fu8_Work_Mode == 1) )

{

            gu8_time_count_free=0;

            if(fu16_set_num_up>9999) fu16_set_num_up=9999;//4λÊý£¬×î´óÏÔʾ9999

            fu32_Displayup[0]=fu16_set_num_up/1000%10;//ǧλ,LCDµÚ1¸öλÖÃ(´Ó×óµ½ÓÒ)--5

            fu32_Displayup[1]=fu16_set_num_up/100%10;//°×λ,LCDµÚ2¸öλÖÃ(´Ó×óµ½ÓÒ)---6

            fu32_Displayup[2]=fu16_set_num_up/10%10;//ʮλ,LCDµÚ3¸öλÖÃ(´Ó×óµ½ÓÒ)----7

            fu32_Displayup[3]=fu16_set_num_up/1%10;//¸öλ,LCDµÚ4¸öλÖÃ(´Ó×óµ½ÓÒ)-----8

            

            if(fu16_set_num_down>9999) fu16_set_num_down=9999;//4λÊý£¬×î´óÏÔʾ9999

            fu32_Displaydown[0]=fu16_set_num_down/1000%10;//ǧλ,LCDµÚ1¸öλÖÃ(´Ó×óµ½ÓÒ)--5

            fu32_Displaydown[1]=fu16_set_num_down/100%10;//°×λ,LCDµÚ2¸öλÖÃ(´Ó×óµ½ÓÒ)---6

            fu32_Displaydown[2]=fu16_set_num_down/10%10;//ʮλ,LCDµÚ3¸öλÖÃ(´Ó×óµ½ÓÒ)----7

            fu32_Displaydown[3]=fu16_set_num_down/1%10;//¸öλ,LCDµÚ4¸öλÖÃ(´Ó×óµ½ÓÒ)-----8

            switch(fu8_Hidden_point)

            {

                case 0://up

                    fu32_Displayup[0]=10;

                    break;

                case 1://up

                    fu32_Displayup[1]=10;

                    break;

                case 2://up

                    fu32_Displayup[2]=10;

                    break;

                case 3://up

                    fu32_Displayup[3]=10;

                    break;

                case 4://up

                    fu32_Displaydown[0]=10;

                    break;

                case 5://up

                    fu32_Displaydown[1]=10;

                    break;

                case 6://up

                    fu32_Displaydown[2]=10;

                    break;

                case 7://up

                    fu32_Displaydown[3]=10;

                    break;

            };

            LCD_YR1618A_VIEW(fu32_Displayup,fu32_Displaydown,fu32_num_123567p,fu32_num_col,fu32_num_s);

        }

        else if ( (gu8_time_count_free==2) && (fu8_Work_Mode == 1) )

        {

            gu8_time_count_free=0;

            fu32_num_123567p[1] |=1;

            fu32_num_123567p[4] |=1;

            fu32_num_s |=S_DATA[1];

            fu32_num_s |=S_DATA[3];

            fu32_num_s |=S_DATA[0];

            

            fu32_num_s &=~S_DATA[12];//S13_BATW,S14_BAT1,S15_BAT2,S16_BAT3

            fu32_num_s &=~S_DATA[13];

            fu32_num_s &=~S_DATA[14];

            fu32_num_s &=~S_DATA[15];

            if(fu16_set_num_up>9999) fu16_set_num_up=9999;//4λÊý£¬×î´óÏÔʾ9999

            fu32_Displayup[0]=fu16_set_num_up/1000%10;//ǧλ,LCDµÚ1¸öλÖÃ(´Ó×óµ½ÓÒ)--5

            fu32_Displayup[1]=fu16_set_num_up/100%10;//°×λ,LCDµÚ2¸öλÖÃ(´Ó×óµ½ÓÒ)---6

            fu32_Displayup[2]=fu16_set_num_up/10%10;//ʮλ,LCDµÚ3¸öλÖÃ(´Ó×óµ½ÓÒ)----7

            fu32_Displayup[3]=fu16_set_num_up/1%10;//¸öλ,LCDµÚ4¸öλÖÃ(´Ó×óµ½ÓÒ)-----8

            

            if(fu16_set_num_down>9999) fu16_set_num_down=9999;//4λÊý£¬×î´óÏÔʾ9999

            fu32_Displaydown[0]=fu16_set_num_down/1000%10;//ǧλ,LCDµÚ1¸öλÖÃ(´Ó×óµ½ÓÒ)--5

            fu32_Displaydown[1]=fu16_set_num_down/100%10;//°×λ,LCDµÚ2¸öλÖÃ(´Ó×óµ½ÓÒ)---6

            fu32_Displaydown[2]=fu16_set_num_down/10%10;//ʮλ,LCDµÚ3¸öλÖÃ(´Ó×óµ½ÓÒ)----7

            fu32_Displaydown[3]=fu16_set_num_down/1%10;//¸öλ,LCDµÚ4¸öλÖÃ(´Ó×óµ½ÓÒ)-----8

            LCD_YR1618A_VIEW(fu32_Displayup,fu32_Displaydown,fu32_num_123567p,fu32_num_col,fu32_num_s);

        }

#endif

    }

}

 

 

 

测试

使用模拟信号发生器输出不同参考电压,开发板采集对比。

测试4个点分别是0,500,1500,2500mV.

image-20220926232153-1.png  

 

image-20220926232153-2.png  

image-20220926232153-3.png  

image-20220926232153-4.png  

image-20220926232153-5.jpeg  

image-20220926232153-6.jpeg  

image-20220926232153-7.jpeg  

image-20220926232153-8.jpeg  

 

设置值

测试值

除去0偏

除去0偏 误差

0

19

0

0

504

529

510

1.2%

1495

1523

1504

0.6%

2503

2523

2504

0.04%

 

从上可以看出有19mV左右的0偏,除去0偏,可以看到值越大相对误差越小。

1500mV以上时,可以达到百分之一以内。如果做分段校正精度会更好。

总结

基于官方的HAL库,能进行快速功能验证开发,十分高效。

从测试来看ADC精度,线性度性能都不错。

 

 

回复评论 (1)

“从上可以看出有19mV左右的0偏,除去0偏,可以看到值越大相对误差越小。

1500mV以上时,可以达到百分之一以内。如果做分段校正精度会更好。”

在评价被评测对象说是误差时,最好说明标准源是不是经过较准,这样对被评测的厂家似乎公平些。或者用较准的表来同时测量,这样更科学,更公正。

点赞  2022-9-27 15:23
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复