本次基于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.
设置值 |
测试值 |
除去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精度,线性度性能都不错。
“从上可以看出有19mV左右的0偏,除去0偏,可以看到值越大相对误差越小。
1500mV以上时,可以达到百分之一以内。如果做分段校正精度会更好。”
在评价被评测对象说是误差时,最好说明标准源是不是经过较准,这样对被评测的厂家似乎公平些。或者用较准的表来同时测量,这样更科学,更公正。