新手入门
- 积分
- 14
- 金钱
- 14
- 注册时间
- 2020-9-4
- 在线时间
- 3 小时
|
1金钱
我是个STM32的新手,最近想用两路PWM波来控制舵机,但是TIM12通道2控制的舵机不能转动,只有TIM13通道1可以转动,当我把TIM12通道2换成TIM14通道1时,就可以转动了。希望各位能执教一下。利用例程稍微修改添加后,初始化代码如下:
#include "timer.h"
#include "led.h"
TIM_HandleTypeDef TIM3_Handler; //
TIM_HandleTypeDef TIM12_Handler; //
TIM_HandleTypeDef TIM13_Handler;
TIM_OC_InitTypeDef TIM12_CH2Handler; //
TIM_OC_InitTypeDef TIM13_CH1Handler;
void TIM3_Init(u16 arr,u16 psc)
{
TIM3_Handler.Instance=TIM3; //
TIM3_Handler.Init.Prescaler=psc; //
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //
TIM3_Handler.Init.Period=arr; //
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//
HAL_TIM_Base_Init(&TIM3_Handler);
HAL_TIM_Base_Start_IT(&TIM3_Handler); //
}
void TIM_PWM_Init(u16 arr,u16 psc)
{
TIM12_Handler.Instance=TIM12; //
TIM12_Handler.Init.Prescaler=psc; //
TIM12_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//
TIM12_Handler.Init.Period=arr; //
TIM12_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&TIM12_Handler); //
TIM12_CH2Handler.OCMode=TIM_OCMODE_PWM1; //
TIM12_CH2Handler.Pulse=arr*0.075; //
TIM12_CH2Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //
HAL_TIM_PWM_ConfigChannel(&TIM12_Handler,&TIM12_CH2Handler,TIM_CHANNEL_2);//
HAL_TIM_PWM_Start(&TIM12_Handler,TIM_CHANNEL_2);//
//
TIM13_Handler.Instance=TIM13; //
TIM13_Handler.Init.Prescaler=psc; //
TIM13_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//
TIM13_Handler.Init.Period=arr; //
TIM13_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&TIM13_Handler); //
TIM13_CH1Handler.OCMode=TIM_OCMODE_PWM1; //
TIM13_CH1Handler.Pulse=arr*0.075; //
TIM13_CH1Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //
HAL_TIM_PWM_ConfigChannel(&TIM13_Handler,&TIM13_CH1Handler,TIM_CHANNEL_1);//
HAL_TIM_PWM_Start(&TIM13_Handler,TIM_CHANNEL_1);//
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE(); //
HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //
HAL_NVIC_EnableIRQ(TIM3_IRQn); //
}
}
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef GPIO_Initure;
GPIO_InitTypeDef GPIO_Initure_12;
__HAL_RCC_TIM12_CLK_ENABLE(); //
__HAL_RCC_GPIOB_CLK_ENABLE(); //
__HAL_RCC_TIM13_CLK_ENABLE(); //
__HAL_RCC_GPIOF_CLK_ENABLE(); //
GPIO_Initure_12.Pin=GPIO_PIN_15; //PB15
GPIO_Initure_12.Mode=GPIO_MODE_AF_PP; //
GPIO_Initure_12.Pull=GPIO_PULLUP; //
GPIO_Initure_12.Speed=GPIO_SPEED_HIGH; //
GPIO_Initure_12.Alternate= GPIO_AF9_TIM12; //
HAL_GPIO_Init(GPIOB,&GPIO_Initure_12);
GPIO_Initure.Pin=GPIO_PIN_8; //PF8
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //
GPIO_Initure.Pull=GPIO_PULLUP; //
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //
GPIO_Initure.Alternate= GPIO_AF9_TIM13; //
HAL_GPIO_Init(GPIOF,&GPIO_Initure);
}
void TIM_SetTIM12Compare1(u32 compare)
{
TIM12->CCR1=compare;
}
void TIM_SetTIM13Compare1(u32 compare)
{
TIM13->CCR1=compare;
}
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM3_Handler);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM3_Handler))
{
// LED1=!LED1; //
}
}
|
|