蓝桥杯嵌入式第十一届第二场本科生G431练习版

输入信号和占空比的精度要求不会弄,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 ;
	
	}
	
	
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值