1648 views|1 replies

501

Posts

4

Resources
The OP
 

[Shanghai Hangxin ACM32F070 development board + touch function evaluation board] PWM signal generator implementation and accuracy test [Copy link]

 

PWM信号发生器

Preface

This time, based on the timer's PWM output and segment code display, the function of a PWM generator is realized.

process

Based on LCD_TK.

Use the upper 4 digits to display the period, unit 10uS >=1.

Use the lower 4 digits to display the duty cycle, 0~100.

Use TIMER1, PC8 output.

App.c code is as follows

test

The test settings are 1*10uS and 10*10uS, and the duty cycle is 50% and 80% respectively.

Setting the cycle

Setting the Duty Cycle

Testing cycle

Test duty cycle

Cycle Error

Duty cycle error

10uS

50%

10.167uS

50%

1.67%

0

10uS

80%

10.167uS

79.5%

1.67%

0.625%

100uS

50%

100.25

50%

0.25%

0

100uS

80%

100.333uS

80.1%

0.333%

0.125%

/*

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

* @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++;

}

}

}

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

* Filename : app.c

* Description: app source file

* Author(s) : xwl

* version : V1.1

* Modify date : 2021-04-07

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

#include "app.h"

#define PWM_OUTPUT_CHANNEL1 TIM_CHANNEL_1

#define TIM_CLOCK_FREQ (8000000U)

uint32_t g_period = 1;

uint32_t g_duty = 50;

TIM_HandleTypeDef TIM_Handler;

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

* Function: TIM1_MSP_Pre_Init

* Description: timer 1 initiation, includes clock, nvic

* Input: htim, timer handler

* Output : none

* Author : xwl

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

void TIM1_MSP_Pre_Init(TIM_HandleTypeDef * htim)

{

HAL_TIMER_MSP_Init(htim);

}

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

* Function: TIM1_MSP_Post_Init

* Description: timer 1 gpio initiation, configure PC8 as TIMER1 CH1

* Input : none

* Output : none

* Author : xwl

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

void TIM1_MSP_Post_Init(void)

{

GPIO_InitTypeDef gpio_init;

gpio_init.Pin = GPIO_PIN_8; //TIM1_CH1

gpio_init.Mode = GPIO_MODE_AF_PP;

gpio_init.Pull = GPIO_NOPULL;

gpio_init.Alternate = GPIO_FUNCTION_2;

HAL_GPIO_Init(GPIOC, &gpio_init); // PC8

}

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

* Function: TIM1_Init

* Description: timer 1 initiation, includes clock, io, configuration

* Input : none

* Output : none

* Author : xwl

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

void TIM1_Init(uint8_t period,uint8_t duty)

{

TIM_OC_InitTypeDef Tim_OC_Init_Para;

uint32_t timer_clock;

timer_clock = System_Get_APBClock();

if (System_Get_SystemClock() != System_Get_APBClock()) // if hclk/pclk != 1, then timer clk = pclk * 2

{

timer_clock = System_Get_APBClock() << 1;

}

TIM_Handler.Instance = TIM1;

TIM_Handler.Init.ARRPreLoadEn = TIM_ARR_PRELOAD_ENABLE;

TIM_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

TIM_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;

TIM_Handler.Init.RepetitionCounter = 0;

TIM_Handler.Init.Prescaler = (timer_clock/TIM_CLOCK_FREQ) - 1;

if (timer_clock%TIM_CLOCK_FREQ > TIM_CLOCK_FREQ/2)

{

TIM_Handler.Init.Prescaler = TIM_Handler.Init.Prescaler + 1;

}

TIM_Handler.Init.Period = period*((TIM_CLOCK_FREQ/1000000)*10 - 1); // period = 10us

TIM1_MSP_Pre_Init(&TIM_Handler);

HAL_TIMER_Base_Init(&TIM_Handler);

Tim_OC_Init_Para.OCMode = OUTPUT_MODE_PWM1;

Tim_OC_Init_Para.OCIdleState = OUTPUT_IDLE_STATE_0;

Tim_OC_Init_Para.OCNIdleState = OUTPUT_IDLE_STATE_0;

Tim_OC_Init_Para.OCPolarity = OUTPUT_POL_ACTIVE_HIGH;

Tim_OC_Init_Para.OCNPolarity = OUTPUT_POL_ACTIVE_HIGH;

Tim_OC_Init_Para.OCFastMode = OUTPUT_FAST_MODE_DISABLE;

Tim_OC_Init_Para.Pulse = (2*duty*TIM_Handler.Init.Period+50)/200; // duty cycle

HAL_TIMER_Output_Config(TIM_Handler.Instance, &Tim_OC_Init_Para, PWM_OUTPUT_CHANNEL1);

TIM1_MSP_Post_Init();

}

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();

TIM1_Init(g_period,g_duty);

HAL_TIM_PWM_Output_Start(TIM_Handler.Instance, PWM_OUTPUT_CHANNEL1);

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();

if(fu8_Tkey_state == 11)

{

g_period++;

}

if(fu8_Tkey_state == 8)

{

if(g_period >=2 )

{

g_period--;

}

}

if(fu8_Tkey_state == 9)

{

g_duty++;

if(g_duty >=100)

{

g_duty=100;

}

}

if(fu8_Tkey_state == 7)

{

if(g_duty >=1)

{

g_duty--;

}

}

if(fu8_Tkey_state != 0xFF)

{

HAL_TIM_PWM_Output_Stop(TIM_Handler.Instance, PWM_OUTPUT_CHANNEL1);

TIM1_Init(g_period,g_duty);

HAL_TIM_PWM_Output_Start(TIM_Handler.Instance, PWM_OUTPUT_CHANNEL1);

}

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

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

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

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

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

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

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

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

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

}

}

Summarize

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

From the test, the PWM output accuracy, cycle accuracy can reach less than 1%, and the duty cycle accuracy can reach less than 1%.

Another BUG was found

The upper four digits of the value 1 are displayed as 101, as shown in the picture above.

There is a problem with the hundreds place, the simulator tracks the value fine, it can only be a display problem.

This post is from Domestic Chip Exchange

Latest reply

Based on the official HAL library, rapid functional verification and development can be carried out, which is very efficient. From the test, the PWM output accuracy, cycle accuracy can reach less than 1%, and the duty cycle accuracy can reach less than 1%. The review includes screenshots of the oscilloscope and a comparison table, which is very detailed. However, it would be more convincing if the brand of the oscilloscope could be indicated and whether it has been calibrated.   Details Published on 2022-9-27 15:07
 
 

6841

Posts

11

Resources
2
 

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

From the test, the PWM output accuracy, cycle accuracy can reach less than 1%, and the duty cycle accuracy can reach less than 1%.

The review includes screenshots of the oscilloscope and a comparison table, which is very detailed.

However, it would be more convincing if the brand of the oscilloscope could be indicated and whether it has been calibrated.

This post is from Domestic Chip Exchange
 
 
 

Just looking around
Find a datasheet?

EEWorld Datasheet Technical Support

Featured Posts
Web 3 Swordsman installation and download (FLASH and other installation software)

Webpage Maker 3 is a webpage maker developed by Macromedia. It consists of three softwares: DREAMWEAVER (webpage maker), ...

Top Ten Weird Pictures in the World: Eyes Deceiving the Brain. Do you understand?

Top Ten Weird Pictures in the World: Eyes Deceiving the Brain. Do you understand? Is a column round or square? Where ...

Solve the hidden BUG problem of the HX711 chip of the weight scale

I have done a project before, which has a weight detection function. I consulted a lot of information and finally loc ...

X-NUCLEO-IKS01A3 Review——by dcexpert

Received the X-NUCLEO-IKS01A3 sensor kit More images of the sensor suite Connecting X-NUCLEO-IKS01A3 using MicroP ...

C6000 embedded assembly C and assembly comparison and function description

1. Absolute value function (1) _abs() C code: int _abs(int src) Assembly: ABS function: Calculate the absolute va ...

National Technology General MCU BOOT Interface Basic Instruction Usage Guide

This user guide mainly describes the basic instructions of the BOOT interface of the N32G45x series, N32G4FR series, and ...

[Qinheng RISC-V core CH582] Use WCH_Link online simulation to debug LED light cycle

This afternoon and evening, create a new project file in MounRiver Studio integrated development environment, compile an ...

Transimpedance

This post was last edited by captz on 2022-4-25 09:53 Share the stories you saw recently A man was eating water chest ...

Why are exceptions and interrupts designed so complicated? - Reading notes on "RISC-V Architecture Programming and Practice"

This post was last edited by jobszheng5 on 2023-5-11 15:13 In the ARM company's RISC instruction set Cortex-M3 series ...

There are many IoT communication protocols. Which one do you choose?

The six communication protocols used in the Internet of Things include: Wi-Fi, RF, RFID, Bluetooth, and Near Field Commu ...

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

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