新手入门
- 积分
- 11
- 金钱
- 11
- 注册时间
- 2020-10-11
- 在线时间
- 2 小时
|
//PWM波初始化的程序
#include "init.h"
#include "gpio.h"
//斜波函数初始化
void ramp_init(ramp_function_source_t *ramp_source_type, float frame_period, uint32_t max, uint32_t min)
{
ramp_source_type->frame_period = frame_period; //斜波函数增加的时间间隔
ramp_source_type->max_value = max; //输出的最大比较值
ramp_source_type->min_value = min; //输出的最小比较值
ramp_source_type->input = 0.0f; //输入
ramp_source_type->out = 0.0f; //输出
}
//斜波函数计算,out=out+input*frame_period
void ramp_calc(ramp_function_source_t *ramp_source_type, uint32_t input)
{
ramp_source_type->input = input;
ramp_source_type->out += ramp_source_type->input * ramp_source_type->frame_period;
if (ramp_source_type->out > ramp_source_type->max_value)
{
ramp_source_type->out = ramp_source_type->max_value;
}
else if (ramp_source_type->out < ramp_source_type->min_value)
{
ramp_source_type->out = ramp_source_type->min_value;
}
}
//TIM2_CH1 PWM 部分初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
void tim2_pwm_init(uint16_t arr,uint16_t psc)
{
TIM_HandleTypeDef TIM2_Handler;
TIM_OC_InitTypeDef TIM2_CH1Handler;
//作用都是初始化定时器的ARR和PSC等参数
TIM2_Handler.Instance=TIM2;
TIM2_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
TIM2_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;
TIM2_Handler.Init.Period=arr;
TIM2_Handler.Init.Prescaler=psc;
HAL_TIM_PWM_Init(&TIM2_Handler);
TIM2_CH1Handler.OCMode=TIM_OCMODE_PWM1;
//选择模式1,计数器的值小于比较值,输出有效电平
TIM2_CH1Handler.OCPolarity=TIM_OCPOLARITY_LOW;
//选择低极性,高电平有效
TIM2_CH1Handler.Pulse=150;
//设置比较值,此值用来确定占空比
HAL_TIM_PWM_ConfigChannel(&TIM2_Handler,&TIM2_CH1Handler,TIM_CHANNEL_1);
//在完成以上设置了之后,我们需要使能 TIM2_CH1
HAL_TIM_PWM_Start(&TIM2_Handler,TIM_CHANNEL_1);
}
//定时器底层驱动,时钟使能,引脚配置
//此函数会被 HAL_TIM_PWM_Init()调用
//htim:定时器句柄
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启 GPIOB 时钟
__HAL_RCC_TIM2_CLK_ENABLE(); //开启 TIM2 时钟
GPIO_Initure.Alternate=GPIO_AF1_TIM2; //将PA0复用为TIM2_CH1
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pin=GPIO_PIN_0;
GPIO_Initure.Pull=GPIO_PULLUP;
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}
//设置 TIM2 通道 1 的占空比
//compare:比较值
void TIM_SetTIM2Compare1(uint32_t compare)
{
TIM2->CCR1=compare;
}
#include "gpio.h"
#include "init.h"
int main(void)
{
tim2_pwm_init(1999,839); //PWM波初始化,arr=1999,psc=839,周期为20ms
ramp_function_source_t shoot; //定义斜波函数的结构体
ramp_init(&shoot,0.01,150,105); //输出最大值是150,最小值105
while (1)
{
ramp_calc(&shoot,155); //输入是155
TIM_SetTIM2Compare1(shoot.out); //输入PWM的比较值
HAL_Delay(10); //延时10ms
}
}
|
|