目录

1.题目要求

2.user.h中

3.user.c中

4.main中

5.注意点


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一直低电平

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐