OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3300|回复: 2

为什么将PWM输出例程中的计时器改成TIM12 通道2后输出不了PWM波呢?

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-9-4
在线时间
3 小时
发表于 2020-9-6 22:58:27 | 显示全部楼层 |阅读模式
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;        //
    }
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14407
金钱
14407
注册时间
2018-8-3
在线时间
1156 小时
发表于 2020-9-7 09:56:18 | 显示全部楼层
用示波器 先打下TIM12通道二的IO 是否有PWM 波输出吧
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-9-4
在线时间
3 小时
 楼主| 发表于 2020-9-7 19:27:45 来自手机 | 显示全部楼层
翼行园子 发表于 2020-9-7 09:56
用示波器 先打下TIM12通道二的IO 是否有PWM 波输出吧

虽然我没用示波器(因为在家中没有设备),但是我觉得是有输出的,每次舵机都会转到一个固定的角度,但是无法改变角度,我使用TIM14 通道1又可以改变角度。。我就觉得很奇怪
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-17 14:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表