题目
首先是cubeMX的配置,注意激活TIM16、17并且选中pwm的通道一
其中Prescaler按照各位小伙伴自己的频率设置,我的主频80MHZ,所以填的79,分频成1MHZ,PA6是100HZ,所以Counter为9999,PA为200HZ,所以为4999,Pulse相当于高电平持续时间,默认百分之十,所以PA6为1000,PA7为500。小伙伴们可以自行计算自己应该设置的值。
接下来是代码部分:
__IO uint32_t keyTick;
u8 lcd_display = 0; //界面 0 1
u8 pwm_mode; //模式 0 1
u8 time16_cnt = 10,time17_cnt=10; //PA6 PA7 占空比
u8 led_ctrl; //led控制
u16 adc2_value; //adc读取
float V37; //r37的电位
//1.lcd显示
void LCD_Process()
{
u8 text[30];
//主界面
if(!lcd_display)
{
sprintf((char*)text," Data ");
LCD_DisplayStringLine(Line1,text);
sprintf((char*)text," V:%0.2fV ",V37);
LCD_DisplayStringLine(Line3,text);
if(!pwm_mode) //自动模式
{
sprintf((char*)text," Mode:AUTO ");
LCD_DisplayStringLine(Line5,text);
}
if(pwm_mode == 1)//手动模式
{
sprintf((char*)text," Mode:MANU ");
LCD_DisplayStringLine(Line5,text);
}
}
//参数界面
if(lcd_display==1)
{
sprintf((char*)text," Para ");
LCD_DisplayStringLine(Line1,text);
sprintf((char*)text," PA6:%d%% ",time16_cnt);
LCD_DisplayStringLine(Line3,text);
sprintf((char*)text," PA7:%d%% ",time17_cnt);
LCD_DisplayStringLine(Line5,text);
}
}
//2.按键功能
void KEY_Process()
{
//10ms扫描一次
if(uwTick - keyTick<10) return;
keyTick = uwTick;
Key_Read();
if(Trg & 0x01)
{
LCD_Clear(Black);
lcd_display =(lcd_display+1)%2;
}
if(Trg & 0x02)
{
//手动模式并且参数界面
if(pwm_mode && lcd_display ==1)
{
time16_cnt+=10; //PA6占空比加十
if(time16_cnt == 100)
{
time16_cnt = 10;
}
}
}
if(Trg & 0x04)
{
if(pwm_mode && lcd_display ==1)
{
time17_cnt+=10; //PA7占空比加十
if(time17_cnt == 100)
{
time17_cnt = 10;
}
}
}
if(Trg & 0x08)
{
pwm_mode =(pwm_mode+1)%2;
}
}
//3.adc读取
void ADC_Process()
{
HAL_ADC_Start(&hadc2);
adc2_value = HAL_ADC_GetValue(&hadc2);
V37 = (adc2_value/4095.0f)*3.3f;
}
//4.PWM占空比调节
void PWM_Process()
{
if(!pwm_mode) //自动模式
{
TIM16->CCR1 = (V37 / 3.3f) *100;
TIM16->CCR1 = (V37 / 3.3f) *50;
}
else if(pwm_mode==1)
{
TIM16->CCR1 = 100 *time16_cnt; //CCR1为占空比 ARR为周期
TIM17->CCR1 = 50 *time17_cnt;
}
}
//5.led灯任务
void LED_Process()
{
if(!pwm_mode)
led_ctrl |= 0x01;
else
led_ctrl &= ~ 0x01;
if(!lcd_display)
led_ctrl |= 0x02;
else
led_ctrl &= ~0x02;
LED_Control(led_ctrl);
}
老样子,主函数调用即可
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
LCD_Process();
ADC_Process();
KEY_Process();
PWM_Process();
LED_Process();
}