初级会员

- 积分
- 74
- 金钱
- 74
- 注册时间
- 2016-2-4
- 在线时间
- 48 小时
|
50金钱
#include "PWM.h"
/********************************************************************************************
PWM输出引脚分配
定时器1和定时器8挂载在APB2总线上
CTL_AZ_PWMA PA8 方位A相PWM输出 引脚号:100 TIM1_CH1
CTL_AZ_PWMB PA9 方位B相PWM输出 引脚号:101 TIM1_CH2
CTL_AZ_PWMC PA10 方位C相PWM输出 引脚号:102 TIM1_CH3
CTL_EL_PWMA PC6 俯仰A相PWM输出 引脚号:96 TIM8_CH1
CTL_EL_PWMB PC9 俯仰B相PWM输出 引脚号:99 TIM8_CH4
CTL_EL_PWMC PC8 俯仰C相PWM输出 引脚号:98 TIM8_CH3
********************************************************************************************/
/*********************************************************************************************
定时器1在APB2上,APB2的定时器时钟为200MHz
arr:自动重装值。
psc:时钟预分频数
定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
Ft=定时器工作频率,单位:Mhz
**********************************************************************************************/
void TIM1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_Initure; //GPIO结构体
TIM_HandleTypeDef TIM1_Handler; //定时器句柄
TIM_OC_InitTypeDef TIM1_CH1Handler; //定时器1通道1句柄
TIM_OC_InitTypeDef TIM1_CH2Handler; //定时器1通道2句柄
TIM_OC_InitTypeDef TIM1_CH3Handler; //定时器1通道3句柄
//使能定时器1和GPIOA的时钟
__HAL_RCC_TIM1_CLK_ENABLE(); //使能定时器1
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
//初始化定时器属性
TIM1_Handler.Instance=TIM1; //定时器1
TIM1_Handler.Init.Prescaler=psc; //定时器分频
TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数模式
TIM1_Handler.Init.Period=arr; //自动重装载值
TIM1_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&TIM1_Handler); //初始化PWM,没有使用回调函数
//对输出PWM波的引脚进行电气初始化
//TIM1_CH1使用引脚初始化
GPIO_Initure.Pin=GPIO_PIN_8; //PA8
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推完输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF1_TIM1; //PA8复用为TIM1_CH1
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
//TIM1_CH2使用引脚初始化
GPIO_Initure.Pin=GPIO_PIN_9; //PA9
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推完输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF1_TIM1; //PA9复用为TIM1_CH2
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
//TIM1_CH3使用引脚初始化
GPIO_Initure.Pin=GPIO_PIN_10; //PA10
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推完输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF1_TIM1; //PA10复用为TIM1_CH3
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
//PWM模式输出定义
//TIM1_CH1PWM模式设置
TIM1_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
TIM1_CH1Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,
//默认比较值为自动重装载值的一半,即占空比为50%
TIM1_CH1Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低
HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&TIM1_CH1Handler,TIM_CHANNEL_1); //配置TIM1_CH1
//TIM1_CH2PWM模式设置
TIM1_CH2Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
TIM1_CH2Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,
//默认比较值为自动重装载值的一半,即占空比为50%
TIM1_CH2Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低
HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&TIM1_CH2Handler,TIM_CHANNEL_2); //配置TIM1_CH2
//TIM1_CH3PWM模式设置
TIM1_CH3Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
TIM1_CH3Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,
//默认比较值为自动重装载值的一半,即占空比为50%
TIM1_CH3Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低
HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&TIM1_CH3Handler,TIM_CHANNEL_3); //配置TIM1_CH3
//使能各PWM输出通道
HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_1); //开启TIM1_CH1
HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_2); //开启TIM1_CH2
HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_3); //开启TIM1_CH3
}
/*********************************************************************************************
定时器8在APB2上,APB2的定时器时钟为200MHz
arr:自动重装值。
psc:时钟预分频数
定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
Ft=定时器工作频率,单位:Mhz
**********************************************************************************************/
void TIM8_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_Initure; //GPIO结构体
TIM_HandleTypeDef TIM8_Handler; //定时器句柄
TIM_OC_InitTypeDef TIM8_CH1Handler; //定时器8通道1句柄
TIM_OC_InitTypeDef TIM8_CH3Handler; //定时器8通道3句柄
TIM_OC_InitTypeDef TIM8_CH4Handler; //定时器8通道4句柄
//使能定时器8和GPIOA的时钟
__HAL_RCC_TIM8_CLK_ENABLE(); //使能定时器1
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
//初始化定时器属性
TIM8_Handler.Instance=TIM8; //定时器8
TIM8_Handler.Init.Prescaler=psc; //定时器分频
TIM8_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数模式
TIM8_Handler.Init.Period=arr; //自动重装载值
TIM8_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&TIM8_Handler); //初始化PWM,没有使用回调函数
//对输出PWM波的引脚进行电气初始化
//TIM8_CH1使用引脚初始化
GPIO_Initure.Pin=GPIO_PIN_6; //PC6
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推完输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF3_TIM8; //PC6复用为TIM8_CH1
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
//TIM8_CH3使用引脚初始化
GPIO_Initure.Pin=GPIO_PIN_8; //PC8
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推完输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF3_TIM8; //PC8复用为TIM8_CH3
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
//TIM8_CH4使用引脚初始化
GPIO_Initure.Pin=GPIO_PIN_9; //PC9
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推完输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF3_TIM8; //PC9复用为TIM8_CH4
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
//PWM模式输出定义
//TIM1_CH1PWM模式设置
TIM8_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
TIM8_CH1Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,
//默认比较值为自动重装载值的一半,即占空比为50%
TIM8_CH1Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低
HAL_TIM_PWM_ConfigChannel(&TIM8_Handler,&TIM8_CH1Handler,TIM_CHANNEL_1); //配置TIM1_CH1
//TIM1_CH2PWM模式设置
TIM8_CH3Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
TIM8_CH3Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,
//默认比较值为自动重装载值的一半,即占空比为50%
TIM8_CH3Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低
HAL_TIM_PWM_ConfigChannel(&TIM8_Handler,&TIM8_CH3Handler,TIM_CHANNEL_3); //配置TIM1_CH2
//TIM1_CH3PWM模式设置
TIM8_CH4Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
TIM8_CH4Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,
//默认比较值为自动重装载值的一半,即占空比为50%
TIM8_CH4Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低
HAL_TIM_PWM_ConfigChannel(&TIM8_Handler,&TIM8_CH4Handler,TIM_CHANNEL_4); //配置TIM1_CH3
//使能各PWM输出通道
HAL_TIM_PWM_Start(&TIM8_Handler,TIM_CHANNEL_1); //开启TIM8_CH1
HAL_TIM_PWM_Start(&TIM8_Handler,TIM_CHANNEL_3); //开启TIM8_CH3
HAL_TIM_PWM_Start(&TIM8_Handler,TIM_CHANNEL_4); //开启TIM8_CH4
}
/**************************************************************************************************
用于设置CTL_AZ_PWMA通道的占空比
**************************************************************************************************/
void TIM_Set_CTL_AZ_PWMA_Compare(u32 compare)
{
TIM1->CCR1=compare;
}
/**************************************************************************************************
用于设置CTL_AZ_PWMB通道的占空比
**************************************************************************************************/
void TIM_Set_CTL_AZ_PWMB_Compare(u32 compare)
{
TIM1->CCR2=compare;
}
/**************************************************************************************************
用于设置CTL_AZ_PWMB通道的占空比
**************************************************************************************************/
void TIM_Set_CTL_AZ_PWMC_Compare(u32 compare)
{
TIM1->CCR3=compare;
}
/**************************************************************************************************
用于设置CTL_EL_PWMA通道的占空比
**************************************************************************************************/
void TIM_Set_CTL_EL_PWMA_Compare(u32 compare)
{
TIM8->CCR1=compare;
}
/**************************************************************************************************
用于设置CTL_EL_PWMB通道的占空比
**************************************************************************************************/
void TIM_Set_CTL_EL_PWMB_Compare(u32 compare)
{
TIM8->CCR4=compare;
}
/**************************************************************************************************
用于设置CTL_EL_PWMC通道的占空比
**************************************************************************************************/
void TIM_Set_CTL_EL_PWMC_Compare(u32 compare)
{
TIM8->CCR3=compare;
}
|
|