题目分析
主要用到了
- 按键:按键扫描,消抖处理 + 每个按键执行的任务
- LCD:按照要求实现两个显示界面即可
- LED:在按键按下的条件下,点亮或熄灭某个灯
- ADC:获取R37输出的电压值,并以此控制PWM输出信号占空比
- PWM:通过PA6和PA7引脚输出频率和占空比一定的波
功能模块
key
创建工程 按键刷新时间不大于100MS 按键扫描函数
LCD
添加lcd.c文件 刷新时间100ms 首先编写符合题目要求的LCD的两个显示界面
void task_display(void)
{
if(LCD_show==1)
{
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line0,(unsigned char *)" Data ");
LCD_DisplayStringLine(Line1,(unsigned char *)" ");
sprintf((char *)str, " V:%.2fV ", R37_Value * 3.3 / 4096);
LCD_DisplayStringLine(Line2, (uint8_t *)str);
LCD_DisplayStringLine(Line3,(unsigned char *)" ");
sprintf((char *)str, " Mode:%s ",mode_str);
LCD_DisplayStringLine(Line4, (uint8_t *)str);
LCD_DisplayStringLine(Line5,(unsigned char *)" ");
LCD_DisplayStringLine(Line6,(unsigned char *)" ");
LCD_DisplayStringLine(Line7,(unsigned char *)" ");
LCD_DisplayStringLine(Line8,(unsigned char *)" ");
LCD_DisplayStringLine(Line9,(unsigned char *)" ");
}
else if(LCD_show==2)
{
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line0,(unsigned char *)" Para ");
LCD_DisplayStringLine(Line1,(unsigned char *)" ");
sprintf((char *)str, " PA6:%d%% ", PA6_Duty);
LCD_DisplayStringLine(Line2, (uint8_t *)str);
LCD_DisplayStringLine(Line3,(unsigned char *)" ");
sprintf((char *)str, " PA7:%d%% ", PA7_Duty);
LCD_DisplayStringLine(Line4, (uint8_t *)str);
LCD_DisplayStringLine(Line5,(unsigned char *)" ");
LCD_DisplayStringLine(Line6,(unsigned char *)" ");
LCD_DisplayStringLine(Line7,(unsigned char *)" ");
LCD_DisplayStringLine(Line8,(unsigned char *)" ");
LCD_DisplayStringLine(Line9,(unsigned char *)" ");
}
}
按键and LED
先对按键进行扫描 接着编写按键对应的任务函数
初始模式是数据界面,数据界面LD2点亮。按下B1,切换至参数界面,且LD2熄灭。 if(key_value== 1) { if(LCD_show== 1) { LCD_show=2; LEDx_on(2); } else if(LCD_show==2) { LCD_show=1; LEDx_off(2); } }
在手动模式下,每按一下B2,占空比增加10%,占空比在10%到90%范围内变化。且仅在参数界面,B2起作用。 key_value=0; if(LCD_show== 2) { PA6_Duty+=10; if(PA6_Duty>=100)PA6_Duty=10; if(mode== 1) __HAL_TIM_SET_COMPARE(&htim16, TIM_CHANNEL_1, 10000*PA6_Duty/PA6_Freq); }
切换手动模式和自动模式。手动模式LED1熄灭 key_value=0; if(mode== 0) { mode=1; LEDx_off(1); mode_str=“MANU”; __HAL_TIM_SET_COMPARE(&htim16,TIM_CHANNEL_1,10000PA6_Duty/PA6_Freq); __HAL_TIM_SET_COMPARE(&htim17,TIM_CHANNEL_1,10000PA7_Duty/PA7_Freq); //恢复初始数据 } else if(mode== 1) { mode=0; mode_str=“AUTO”; LEDx_on(1); }
- ADC更新时间小于等于100ms
- 配置PA6 PA7管脚输出PWM波的频率和占空比
自动模式
解读:当ADC可访问且处于自动模式时,占空比D与R37的电压满足一定关系
结果演示
自动模式:随着R37电位器的变化,输出PWM波的占空比也在变化 手动模式: 此为PA7输出的波形 此为PA6输出的波形
未完待续
|