工具/软件:Code Composer Studio
/*用户代码 begin Header */
/**
秘书长的报告
*@文件:main.c
*@简介:主要节目机构
秘书长的报告
*@注意
*
*
版权所有(c) 2019 STMicroelectronics。
*保留所有权利。
*保留所有权利。
*
*此软件组件由 ST 根据 BSD 3条款许可、
*"许可证";除非符合、否则不得使用此文件
*许可证。 您可以在以下位置获取许可证副本:
* opensource.org/licenses/BSD-3-Clause
*
秘书长的报告
*
/*用户代码结尾标头*/
/*包括------------------------------------------ *
#include "main.h"
/*私有包括---------------------------------------------- *
/*用户代码 begin 包括*/
#include "stm32f1xx_hal.h"
/*用户代码末尾包括*/
/*私人 typedef ------------------------------------------------------- *
/*用户代码 begin PTD */
/*用户代码结束 PTD */
/*私人定义------------------------------------------------------- *
/* USER CODE BEGIN PD */
#define Ref_value 0.454
#define Step_Size 4095
#define KP 0.6201
#define Ki 1.0
#define maximum_ADC_VOLTAGE 3.29
/*用户代码末尾 PD */
/*私有宏------------------------------------------------------- *
/*用户代码 begin PM */
/*用户代码结束 PM */
/*私有变量------------------------------------------------------- *
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim1;
/*用户代码 begin PV */
uint16_t ADC_Value=0;
浮点 ADC_Voltage = 0;
fPIerrorIn = 0;
float Error_Value=0;
浮点中间值= 0;
浮点输出= 0;
float pi_out =0;
float new = 0;
TIM_MasterConfigTypeDef sMasterConfig ={0};
TIM_OC_InitTypeDef sConfigOC ={0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig ={0};
/*用户代码末尾 PV */
/*私有函数原型------------------------------------------------------- *
void SystemClock_Config (void);
静态空 MX_GPIO_Init (空);
静态空 MX_ADC1_Init (空);
静态空 MX_TIM1_Init (空);
/*用户代码 begin PFP */
void Start_adc();
void PWM_Change();
void Start_pwm ();
float pi_closed_Loop (float);
float led_Engine();
/*用户代码末尾 PFP */
/*私人用户代码------------------------------------------------------- *
/*用户代码开始0 */
/*用户代码结束0 */
/**
*@简要介绍应用程序入口点。
*@retval int
*
int main (空)
{
/*用户代码 begin 1 */
/*用户代码结束1 */
/* MCU 配置------------------------------------------------------- *
/*复位所有外设、初始化闪存接口和 SysTick。 *
HAL_Init();
/*用户代码 begin Init */
/*用户代码结束初始化*/
/*配置系统时钟*/
SystemClock_Config();
/*用户代码 begin sysinit */
/*用户代码结束 sysinit */
/*初始化所有已配置的外设*/
mx_GPIO_Init();
mx_ADC1_Init();
MX_TIM1_Init();
/*用户代码 begin 2 */
/*用户代码末尾2 */
/*无限循环*/
/*用户代码在*/时开始
while (1)
{
start_adc();
START_PWM();
PWM_Change();
HAL_DELAY (0.1);
LED_Engine ();
/*用户代码结束,同时*/
/*用户代码 begin 3 */
}
/*用户代码结束3 */
}
/**
*@简要系统时钟配置
*@Retval 无
*
空系统时钟配置(空)
{
RCC_OscInitTypeDef RCC_OscInitStruct={0};
RCC_ClkInitTypeDef RCC_ClkInitStruct={0};
RCC_PeriphCLKInitTypeDef PeriphClkInit ={0};
/**初始化 CPU、AHB 和 APB 总线时钟
*
RCC_OscInitStruct.OscatorType = RCC_OSCILATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV5;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.Prediv1源= RCC_PreDIV1_Source_PLL2;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
RCC_OscInitStruct.PLL2.PLL2State = RCC_PLL2_ON;
RCC_OscInitStruct.PLL2.PLL2MUL = RCC_PLL2_MUL8;
RCC_OscInitStruct.PLL2.HSEPrediv2Value = RCC_HSE_PREDIV2_DIV5;
IF (HAL_RCC_OscConfig (&RCC_OscInitStruct)!= HAL_OK)
{
ERROR_Handler();
}
/**初始化 CPU、AHB 和 APB 总线时钟
*
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLK 分频器= RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig (&RCC_ClkInitStruct, flash_latit_2)!= HAL_OK)
{
ERROR_Handler();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
if (HAL_RCCEx_PeriphCLKConfig (&PeriphClkInit)!= HAL_OK)
{
ERROR_Handler();
}
/**配置 SysTick 中断时间
*
_HAL_RCC_PLLI2S_ENABLE ();
}
/**
*@简要 ADC1初始化函数
*@param 无
*@Retval 无
*
静态空 MX_ADC1_Init (空)
{
/*用户代码 begin ADC1_Init 0 */
/*用户代码 END ADC1_Init 0 */
ADC_ChannelConfTypeDef sconfig ={0};
/*用户代码 begin ADC1_Init 1 */
/*用户代码 end ADC1_Init 1 */
/**通用配置
*
hadc1.instance = adc1;
hadc1.Init.ScanConvMode = adc_scan_disable;
hadc1.Init.ContinuousConvMode =启用;
hadc1.Init.DiscontinuousConvMode =禁用;
hadc1.Init.ExternalTrigConv = adc_software_start;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1)!= HAL_OK)
{
ERROR_Handler();
}
/**配置常规信道
*
sconfig.Channel = ADC_CHANGE_8;
sconfig.Rank = ADC_Regal_Rank_1;
sconfig.SamplingTime = ADC_SAMPLETIME_41CYCLES_5;
if (HAL_ADC_ConfigChannel (&hadc1、&sconfig)!= HAL_OK)
{
ERROR_Handler();
}
/*用户代码 begin ADC1_Init 2 */
/*用户代码 end ADC1_Init 2 */
}
/**
*@TIM1初始化函数简介
*@param 无
*@Retval 无
*
静态空 MX_TIM1_Init (空)
{
/*用户代码 begin TIM1_Init 0 */
/*用户代码结束 TIM1_Init 0 */
TIM_MasterConfigTypeDef sMasterConfig ={0};
TIM_OC_InitTypeDef sConfigOC ={0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig ={0};
/*用户代码 begin TIM1_Init 1 */
/*用户代码结束 TIM1_Init 1 */
hdim1.instance = TIM1;
Htim1.Init.Prescaler = 0;
Htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.period = 71;
Htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
hdim1.Init.RefetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_PWM_Init (&htim1)!= HAL_OK)
{
ERROR_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_Timex_MasterConfigSynchronization (&htim1、&sMasterConfig)!= HAL_OK)
{
ERROR_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 30;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFast_disable;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel (&htim1、&sConfigOC、TIM_CHANNEL 2)!= HAL_OK)
{
ERROR_Handler();
}
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.dadtime = 1;
sBreakDeadTimeConfig.BreakState = TIM_break_disable;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_Timex_ConfigBreakDeadTime (&htim1、&sBreakDeadTimeConfig)!= HAL_OK)
{
ERROR_Handler();
}
/*用户代码 begin TIM1_Init 2 */
/*用户代码结束 TIM1_Init 2 */
HAL_TIM_MspPostInit(&Htim1);
}
/**
*@简单 GPIO 初始化函数
*@param 无
*@Retval 无
*
静态空 MX_GPIO_Init (空)
{
/* GPIO 端口时钟启用*/
_HAL_RCC_GPIOD_CLK_ENABLE ();
_HAL_RCC_GPIOB_CLK_ENABLE ();
_HAL_RCC_GPIOA_CLK_ENABLE ();
}
/*用户代码 begin 4 */
空 Start_adc ()
{
HAL_ADC_Start (&hadc1);
ADC_Value = HAL_ADC_GetValue (&hadc1);
}
空 Start_PWM ()
{
/*启动计时器1*/的通道1
if (HAL_TIM_PWM_Start (&hmim1、TIM_CHANNEL 2)!= HAL_OK)
{
ERROR_Handler();
}
/*启动通道1N*/
if (HAL_Timex_PWMn_Start (&htim1、TIM_CHANNEL_2)!= HAL_OK)
{
ERROR_Handler();
}
}
void PWM_Change ()
{
ADC_Voltage =((ADC_Value* maximum_ADC_VOLTAGE)/步长);
}
float led_Engine()
{
pi_out=pi_closed_Loop (adc_Voltage-Ref_value);
NEW = 1 - PI_OUT;
if (ADC_Voltage>0.48)
{
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = new*71;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFast_disable;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel (&htim1、&sConfigOC、TIM_CHANNEL 2)!= HAL_OK)
{
ERROR_Handler();
}
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.dadtime = 1;
sBreakDeadTimeConfig.BreakState = TIM_break_disable;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_Timex_ConfigBreakDeadTime (&htim1、&sBreakDeadTimeConfig)!= HAL_OK)
{
ERROR_Handler();
}
}
IF (ADC_Voltage<0.48)
{
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 65;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFast_disable;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel (&htim1、&sConfigOC、TIM_CHANNEL 2)!= HAL_OK)
{
ERROR_Handler();
}
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.dadtime = 1;
sBreakDeadTimeConfig.BreakState = TIM_break_disable;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_Timex_ConfigBreakDeadTime (&htim1、&sBreakDeadTimeConfig)!= HAL_OK)
{
ERROR_Handler();
}
// HAL_DELAY (1000);
//
// HAL_TIM_PWM_Stop (&hmim1、TIM_CHANNEL 2);
// HAL_Timex_PWMn_Stop (&htim1、TIM_CHANNEL_2);
//
// HAL_DELAY (1000);
//
// HAL_TIM_PWM_Start (&htim1、TIM_CHANNEL 2);
// HAL_Timex_PWMn_Start (&htim1、TIM_CHANNEL_2);
//
// HAL_DELAY (1000);
//
// HAL_TIM_PWM_Stop (&hmim1、TIM_CHANNEL 2);
// HAL_Timex_PWMn_Stop (&htim1、TIM_CHANNEL_2);
//
}
}
float pi_closed_Loop (fPIerrorIn)
{
ERROR_VALUE = fPIerrorIn;// fPIerrorIn 是 PI 控制器的输入
中间值=中间值+(Error_Value*(1/1000000)*Ki);
output=(KP*Error_Value)+ Intermedial_value;
返回输出;
}
/*用户代码结束4 */
/**
*@简述如果发生错误、则执行此函数。
*@Retval 无
*
空 Error_Handler (空)
{
/*用户代码 begin Error_Handler_debug */
/*用户可以添加自己的实现以报告 HAL 错误返回状态*/
/*用户代码 End Error_Handler_debug */
}
#ifdef use_full_assert
/**
*@brief 会报告源文件的名称和源行号
*发生了 assert_param 错误的位置。
*@param 文件:指向源文件名的指针
*@param 行:assert_param 错误行源代码
*@Retval 无
*
void assert_failed (uint8_t *文件、uint32_t 行)
{
/*用户代码 begin 6 */
/*用户可以添加自己的实施以报告文件名和行号,
TEX:printf ("错误的参数值:第%d\r\n"行上的文件%s、文件、行)*/
/*用户代码结束6 */
}
#endif /* use_full_assert */
/******** (c)版权所有 STMicroelectronics ***** 文件末尾****/