6、代码部分(设置PWM占空比)
由于本次应用不占用main.c主循环,我们大多代码是在tim.c中添加的
首先第一步,一定要在main.c中启动定时器TIM2中断
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2); \\启动TIM2中断
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);\\启动TIM1的PWM1
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);\\启动TIM1的PWM2
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);\\启动TIM1的PWM3
/* USER CODE END 2 */
之后再在main.c中的/* USER CODE BEGIN PV */部分定义全局变量stat,中断需要使用
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t stat=0;
/* USER CODE END PV */
改完main.c文件后打开tim.c,首先在包含一下math.h和定义一下π的值,这里用PI表示
/* USER CODE BEGIN 0 */
#include "math.h"
#define PI 3.14159265358979323846
/* USER CODE END 0 */
在最下方的用户代码1部分添加如下TIM2中断回调函数:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
extern uint8_t stat;
if (htim->Instance == TIM2)
{
if (stat<10) stat++;
else stat=0;
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 1000*sin((((float)stat*36)/360)*2*PI));
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 1000* sin(((((float)stat*36)+120)/360)*2*PI));
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 1000*sin(((((float)stat*36)-120)/360)*2*PI));
}
}
由于C语言用的是弧度,所以这里把角度转换成了弧度
|