1378 views|1 replies

501

Posts

4

Resources
The OP
 

[Shanghai Hangxin ACM32F070 development board + touch function evaluation board] Voltage meter implementation and ADC performance rough test [Copy link]

 

电压计

Preface

This time, based on ADC and segment code display, the function of a voltmeter is realized.

process

Based on LCD_TK.

Use the upper 4 digits to display the value in mV.

From the schematic diagram, use the unused ADC input channel, PA7 ADC4.

Add HAL_ADC.c to the project.

App.c is as follows

/*

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

* @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 //GDC042129 ·± °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 //GDC038289 ·± °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//YR1618A9 ·± °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()/*SleepDMA·*/

{

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°è±SystickLCD·òSleep±*/

SysTick->CTRL = 0;

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

System_Enter_Sleep_Mode(SLEEPENTRY_WFI);//sleep

/*°áêSleep1234*/

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 Display 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_Display_Normal:

{

LCD_DisplayTest();

}

/* Stop the process */

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;//§,LCD1(×ó)--5

fu32_Displayup[1]=Voltage/100%10;//°×,LCD2(×ó)---6

fu32_Displayup[2]=Voltage/10%10;//,LCD3(×ó)----7

fu32_Displayup[3]=Voltage/1%10;//,LCD4(×ó)-----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;//§,LCD1(×ó)--5

fu32_Displayup[1]=fu16_set_num_up/100%10;//°×,LCD2(×ó)---6

fu32_Displayup[2]=fu16_set_num_up/10%10;//,LCD3(×ó)----7

fu32_Displayup[3]=fu16_set_num_up/1%10;//,LCD4(×ó)-----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;//§,LCD1(×ó)--5

fu32_Displaydown[1]=fu16_set_num_down/100%10;//°×,LCD2(×ó)---6

fu32_Displaydown[2]=fu16_set_num_down/10%10;//,LCD3(×ó)----7

fu32_Displaydown[3]=fu16_set_num_down/1%10;//,LCD4(×ó)-----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;//§,LCD1(×ó)--5

fu32_Displayup[1]=fu16_num_up/100%10;//°×,LCD2(×ó)---6

fu32_Displayup[2]=fu16_num_up/10%10;//,LCD3(×ó)----7

fu32_Displayup[3]=fu16_num_up/1%10;//,LCD4(×ó)-----8

if(fu16_num_down>9999) fu16_num_down=9999;//4×ó9999

fu32_Displaydown[0]=fu16_num_down/1000%10;//§,LCD1(×ó)--5

fu32_Displaydown[1]=fu16_num_down/100%10;//°×,LCD2(×ó)---6

fu32_Displaydown[2]=fu16_num_down/10%10;//,LCD3(×ó)----7

fu32_Displaydown[3]=fu16_num_down/1%10;//,LCD4(×ó)-----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;//§,LCD1(×ó)--5

fu32_Displayup[1]=fu16_set_num_up/100%10;//°×,LCD2(×ó)---6

fu32_Displayup[2]=fu16_set_num_up/10%10;//,LCD3(×ó)----7

fu32_Displayup[3]=fu16_set_num_up/1%10;//,LCD4(×ó)-----8

if(fu16_set_num_down>9999) fu16_set_num_down=9999;//4×ó9999

fu32_Displaydown[0]=fu16_set_num_down/1000%10;//§,LCD1(×ó)--5

fu32_Displaydown[1]=fu16_set_num_down/100%10;//°×,LCD2(×ó)---6

fu32_Displaydown[2]=fu16_set_num_down/10%10;//,LCD3(×ó)----7

fu32_Displaydown[3]=fu16_set_num_down/1%10;//,LCD4(×ó)-----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;//§,LCD1(×ó)--5

fu32_Displayup[1]=fu16_set_num_up/100%10;//°×,LCD2(×ó)---6

fu32_Displayup[2]=fu16_set_num_up/10%10;//,LCD3(×ó)----7

fu32_Displayup[3]=fu16_set_num_up/1%10;//,LCD4(×ó)-----8

if(fu16_set_num_down>9999) fu16_set_num_down=9999;//4×ó9999

fu32_Displaydown[0]=fu16_set_num_down/1000%10;//§,LCD1(×ó)--5

fu32_Displaydown[1]=fu16_set_num_down/100%10;//°×,LCD2(×ó)---6

fu32_Displaydown[2]=fu16_set_num_down/10%10;//,LCD3(×ó)----7

fu32_Displaydown[3]=fu16_set_num_down/1%10;//,LCD4(×ó)-----8

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

}

#endif

}

}

test

Use an analog signal generator to output different reference voltages, and the development board collects and compares them.

The 4 test points are 0, 500, 1500, and 2500mV.

Setting Value

Test value

Remove 0 bias

Remove zero bias error

0

19

0

0

504

529

510

1.2%

1495

1523

1504

0.6%

2503

2523

2504

0.04%

From the above, we can see that there is a 0 offset of about 19mV. Excluding the 0 offset, we can see that the larger the value, the smaller the relative error.

When the voltage is above 1500mV, the accuracy can be within 1%. If segmented calibration is performed, the accuracy will be better.

Summarize

Based on the official HAL library, rapid functional verification and development can be carried out, which is very efficient.

From the test, the ADC accuracy and linearity performance are good.

This post is from Domestic Chip Exchange

Latest reply

"From the above, we can see that there is a 0 offset of about 19mV. Excluding the 0 offset, we can see that the larger the value, the smaller the relative error. When the voltage is above 1500mV, the accuracy can be within 1%. If segmented calibration is performed, the accuracy will be even better. " When evaluating the object being evaluated, it is best to state whether the standard source has been calibrated, which seems fairer to the manufacturer being evaluated. Or use a more accurate meter to measure at the same time, which is more scientific and fairer.   Details Published on 2022-9-27 15:23
 
 

6841

Posts

11

Resources
2
 

"From the above, we can see that there is a 0 offset of about 19mV. Excluding the 0 offset, we can see that the larger the value, the smaller the relative error.

When the voltage is above 1500mV, the accuracy can be within 1%. If segmented calibration is performed, the accuracy will be even better. "

When evaluating the object being evaluated, it is best to state whether the standard source has been calibrated, which seems fairer to the manufacturer being evaluated. Or use a more accurate meter to measure at the same time, which is more scientific and fairer.

This post is from Domestic Chip Exchange
 
 
 

Just looking around
Find a datasheet?

EEWorld Datasheet Technical Support

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews

Room 1530, Zhongguancun MOOC Times Building, Block B, 18 Zhongguancun Street, Haidian District, Beijing 100190, China Tel:(010)82350740 Postcode:100190

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号
快速回复 返回顶部 Return list