蓝桥杯嵌入式第十一届省赛第二场
计算CCR时要先乘后除,避开浮点数计算,不然CCR的值为0,PWM一直低电平。
·
目录
1.题目要求





2.user.h中
#ifndef __USER_H
#define __USER_H
#include "main.h"
#include "stdio.h"
void key_pro(void);
void ADC_R37_vlot(void);
void lcd_pro(void);
void led_dips(void);
#endif
3.user.c中
#include "user.h"
u32 adc_tick = 0;
double R37_vlot = 0;
extern ADC_HandleTypeDef hadc2;
void ADC_R37_vlot(void)
{
uint16_t ADC_Value;
if(uwTick - adc_tick < 20)
return;
adc_tick = uwTick;
HAL_ADC_Start(&hadc2);
ADC_Value = HAL_ADC_GetValue(&hadc2);
R37_vlot =(3.3f * ADC_Value)/4096.0f;
}
uint8_t key_value,key_down,key_up,key_old = 0;
void key_scan(void)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == RESET)
key_value = 1;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == RESET)
key_value = 2;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2) == RESET)
key_value = 3;
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == RESET)
key_value = 4;
else key_value = 0;
key_down = key_value & (key_value ^ key_old);
key_up = ~key_value & (key_value ^ key_old);
key_old = key_value;
}
extern TIM_HandleTypeDef htim3;
extern TIM_HandleTypeDef htim17;
uint8_t mode = 0; //0代表自动模式,1为手动
uint8_t page_index = 1;
uint8_t PA6_Duty = 10,PA7_Duty = 10,PA67_Duty;
u32 key_tick = 0;
void key_pro(void)
{
if(uwTick - key_tick < 20)
return;
key_tick = uwTick;
key_scan();
if(key_down == 1)
{
page_index ++;
LCD_Clear(Black);
if(page_index > 2)page_index = 1;
}
else if(key_down == 4)
{
mode ++;
if(mode > 1)mode = 0;
}
if(mode == 0)
{
PA67_Duty = R37_vlot * 100.0f / 3.3f;
if(R37_vlot == 0)PA67_Duty = 0;
else if(R37_vlot == 3.30)PA67_Duty = 100;
TIM3->CCR1 = (u16)( (PA67_Duty * (TIM3->ARR + 1)) / 100 );
TIM17->CCR1 = (u16)( (PA67_Duty * (TIM17->ARR + 1)) / 100 );
}
else if(mode == 1)
{
if(page_index == 2)
{
if(key_down == 2)
{
PA6_Duty += 10;
if(PA6_Duty > 90)PA6_Duty = 10;
}
else if(key_down == 3)
{
PA7_Duty += 10;
if(PA7_Duty > 90)PA7_Duty = 10;
}
}
// 计算 CCR1 值(先乘后除),不然浮点数计算会导致CCR为0
TIM3->CCR1 = (u16)((PA6_Duty * (TIM3->ARR + 1)) / 100 );
TIM17->CCR1 = (u16)((PA7_Duty * (TIM17->ARR + 1)) / 100 );
}
// //通过CCR1判断显示内容
// if ((u16)( (PA6_Duty * (TIM3->ARR + 1)) / 100 ) > 0)
// {
// LCD_DisplayStringLine(Line9, (u8 *)" yes ");//显示yes
// }
// else
// {
// LCD_DisplayStringLine(Line9, (u8 *)" no ");
// }
//这有问题,写后PWM一直为低电平//下面这种运算会导致CCR一直为0//ARR + 1为5000
// TIM17 -> CCR1 = (u16)(PA7_Duty/100) * (TIM17 -> ARR + 1);
}
char buf[30];
u32 lcd_tick = 0;
void lcd_pro(void)
{
if(uwTick - lcd_tick < 20)
return;
lcd_tick = uwTick;
if(page_index == 1)
{
LCD_DisplayStringLine(Line0,(u8 *)" Data ");
sprintf(buf," V:%.2lfV ",R37_vlot);
LCD_DisplayStringLine(Line2,(u8 *)buf);
if(!mode)
{
LCD_DisplayStringLine(Line4,(u8 *)" Mode:AUTO ");
}
else
{
LCD_DisplayStringLine(Line4,(u8 *)" Mode:MANU ");
}
}
else if(page_index == 2)
{
LCD_DisplayStringLine(Line0,(u8 *)" Para ");
if(mode)
{
sprintf(buf," PA6:%d%% ",PA6_Duty);
LCD_DisplayStringLine(Line2,(u8 *)buf);
sprintf(buf," PA7:%d%% ",PA7_Duty);
LCD_DisplayStringLine(Line4,(u8 *)buf);
}
else
{
sprintf(buf," PA6:%d%% ",PA67_Duty);
LCD_DisplayStringLine(Line2,(u8 *)buf);
sprintf(buf," PA7:%d%% ",PA67_Duty);
LCD_DisplayStringLine(Line4,(u8 *)buf);
}
//调试用
// sprintf(buf," TIM3_CCR1:%d ",(u16)((PA6_Duty * (TIM3->ARR + 1)) / 100 ));
// LCD_DisplayStringLine(Line6,(u8 *)buf);
// sprintf(buf," TIM17_CCR1:%d ",(u16)((PA7_Duty * (TIM17->ARR + 1)) / 100 ));
// LCD_DisplayStringLine(Line7,(u8 *)buf);
}
}
void led_dips(void)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
if(!mode) //自动模式
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
else if(mode) //手动模式
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
if(page_index == 1) //数据界面
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);
else if(page_index == 2) //参数界面
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
4.main中
#include "user.h"
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC2_Init();
MX_TIM3_Init();
MX_TIM17_Init();
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);
while (1)
{
ADC_R37_vlot();
key_pro();
lcd_pro();
led_dips();
}
}
5.注意点
计算CCR时要先乘后除,避开浮点数计算,不然CCR的值为0,PWM一直低电平
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)