输入信号和占空比的精度要求不会弄,B4按键要求是转换模式,没说是那个界面下,所以数据和参数界面都整了。
这里adc用的是PB15–IN15
pwm1: PA6-- TIM16; pwm2: PA7–TIM17
在cubemx中设置两个定时器的分频系数分别为8000和4000,自动重装载值为100,这样占空比设置比较值就是占空比实际数值 分频系数、自动重装载值、比较值的设定
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "key.h"
#include "i2c_hal.h"
#include "badc.h"
#include "math.h"
/* USER CODE BEGIN PV */
//---------变量创建区
__IO uint32_t uwTick_Key_Set_Point = 0;//控制Key_Proc的执行速度
__IO uint32_t uwTick_Adc_Set_Point =0;
//*按键扫描专用变量
unsigned char ucKey_Val, ucKey_Down, ucKey_Up, ucKey_Old;
//状态
uint8_t ucState;
//*LCD显示专用变量
unsigned char text[21];//最多显示20个字符
//*占空比
uint8_t PWM1_Duty=10;
uint8_t PWM2_Duty=10;
//Vr37电压值
float Vr;
//led
unsigned char ucLed,ucLed1,ucLed2;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
//声明子函数
void Key_Proc(void);
void Lcd_Proc(void);
void Adc_Proc(void);
void Led_Proc(void);
/* USER CODE END PFP */
打开PWM通道
//-----------初始化外设函数----------------
LCD_Init();
LCD_Clear(Black );
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
//2个定时器生成两路占空比等PWM波
HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Key_Proc();
Lcd_Proc();
Adc_Proc();
Led_Proc();
}
//-------------定义函数--------------
//ADC更新时间
void Adc_Proc(void)
{
if((uwTick - uwTick_Adc_Set_Point)<100) return;//减速函数
uwTick_Adc_Set_Point = uwTick;
Vr=getADC(&hadc2);
}
//LED处理函数
void Led_Proc(void)
{
if(ucState ==0||ucState ==2)
ucLed1=0x01;
if(ucState ==1||ucState ==3)
ucLed1 =0x00;
if(ucState ==3||ucState ==2)
ucLed2= 0x00;
if(ucState ==0||ucState ==1)
ucLed2= 0x02;
ucLed =ucLed1|ucLed2 ;
LED_Disp (ucLed);
}
//按键处理函数
void Key_Proc(void)
{
if((uwTick - uwTick_Key_Set_Point)<100) return;//减速函数
uwTick_Key_Set_Point = uwTick;
ucKey_Val = Key_Scan();
ucKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val);
ucKey_Up = ~ucKey_Val & (ucKey_Old ^ ucKey_Val);
ucKey_Old = ucKey_Val;
switch(ucKey_Down)
{
case 1:
switch(ucState)
{
case 0:
ucState =2;
break ;
case 1:
ucState =3;
break ;
case 2:
ucState =0;
break ;
case 3:
ucState =1;
break ;
}
break;
case 2:
if(ucState ==3)
if((PWM1_Duty+=10) >=100)
PWM1_Duty =10;
__HAL_TIM_SET_COMPARE(&htim16 , TIM_CHANNEL_1,PWM1_Duty );
break;
case 3:
if(ucState ==3)
if((PWM2_Duty+=10) >=100)
PWM2_Duty =10;
__HAL_TIM_SET_COMPARE(&htim17 , TIM_CHANNEL_1,PWM2_Duty );
break;
case 4:
// if(++ucState ==2) ucState =0;
// if(++ucState ==4)ucState =2;
switch(ucState)
{
case 0:
ucState =1;
break ;
case 1:
ucState =0;
break ;
case 2:
ucState =3;
break ;
case 3:
ucState =2;
break ;
}
break;
}
}
void Lcd_Proc(void)
{
sprintf((char *)text,"%d",ucState );
LCD_DisplayStringLine(Line8,(uint8_t *)text);
if((ucState ==0)||(ucState ==1))
{
sprintf((char *)text," Data ");
LCD_DisplayStringLine(Line0,(uint8_t *)text);
sprintf((char *)text," V:%.2fV ",Vr);
LCD_DisplayStringLine(Line2,(uint8_t *)text);
}
else
{
sprintf((char *)text," Para ");
LCD_DisplayStringLine(Line0,(uint8_t *)text);
}
switch(ucState)
{
case 0:
sprintf((char *)text," Mode:AUTO ");
LCD_DisplayStringLine(Line4,(uint8_t *)text);
break ;
case 1:
sprintf((char *)text," Mode:MANU ");
LCD_DisplayStringLine(Line4,(uint8_t *)text);
break ;
case 3:
sprintf((char *)text," PA6:%d%% ",PWM1_Duty);
LCD_DisplayStringLine(Line2,(uint8_t *)text);
sprintf((char *)text," PA7:%d%% ",PWM2_Duty);
LCD_DisplayStringLine(Line4,(uint8_t *)text);
break ;
case 2:
PWM1_Duty=PWM2_Duty =(Vr/3.3)*100;
__HAL_TIM_SET_COMPARE(&htim16 , TIM_CHANNEL_1,PWM1_Duty );
__HAL_TIM_SET_COMPARE(&htim17 , TIM_CHANNEL_1,PWM2_Duty );
sprintf((char *)text," PA6:%d%% ",PWM1_Duty);
LCD_DisplayStringLine(Line2,(uint8_t *)text);
sprintf((char *)text," PA7:%d%% ",PWM2_Duty);
LCD_DisplayStringLine(Line4,(uint8_t *)text);
break ;
}
}