STM32F407ZG 用TIM14CH1和TIM3CH1两个定时器两个通道产生的PWM波 驱动两个舵机 只有一个工作 另一个不工作

2019-07-20 15:51发布

本人想利用STM32F407ZG产生两路PWM波对两个舵机进行控制 在原子的实验9 PWM波输出实验改的 由于TIM14只有CH1通道 所以又启用了一个TIM3CH1通道 但是发现只有TIM14CH1对应引脚的舵机工作 同样的舵机在TIM3CH1对应的引脚下不工作 所以不是舵机的问题,而TIM3还可以产生PWM波进行灯的控制 所以也不是定时器的问题;我的tim3ch1完全按照TIM14CH1配置改的 ,请大家帮我看看是不是配置不对,难道通用定时器的配置还不一样吗?TIM14CH1对应的引脚是PF9 TIM3CH1对应的引脚是PC6 严格按照数据手册上查的 。跪谢大神,急求!!!
下面是PWM.C的代码
#include "pwm.h"
#include "led.h"
#include "usart.h"
 
//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F407开发板
//定时器PWM 驱动代码   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2014/5/4
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved  
//////////////////////////////////////////////////////////////////////////////////  


//TIM14 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM14_PWM_Init(u32 arr,u32 psc)
{  
//此部分需手动修改IO口设置

GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);   //TIM14时钟使能    
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟

GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;           //GPIOF9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure);              //初始化PF9
 
TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 

TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14

//初始化TIM14 Channel1 PWM模式  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC1Init(TIM14, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 4OC1

TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);  //使能TIM14在CCR1上的预装载寄存器
 
  TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能 

TIM_Cmd(TIM14, ENABLE);  //使能TIM14
 
}  

void TIM3_PWM_Init(u32 arr,u32 psc)
{  
//此部分需手动修改IO口设置

GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);   //TIM3时钟使能    
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //使能PORTF时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;           //GPIOC6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
GPIO_Init(GPIOC,&GPIO_InitStructure);              //初始化PC6
GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM3); //GPIOC6复用为定时器3
 
TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=0; 
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//初始化定时器3

//初始化TIM3 Channel1 PWM模式  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性低
TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3OC1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR1上的预装载寄存器
    TIM_ARRPreloadConfig(TIM3,ENABLE);//ARPE使能 
TIM_Cmd(TIM3, ENABLE);  //使能TIM3  

下面是main.c代码
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"


//ALIENTEK 探索者STM32F407开发板 实验9
//PWM输出实验-库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://openedv.taobao.com  
//广州市星翼电子科技有限公司  
//作者:正点原子 @ALIENTEK

int main(void)

//float duty;    
//u8 dir=1;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168);  //初始化延时函数
uart_init(115200);//初始化串口波特率为115200
  TIM14_PWM_Init(20000-1,84-1); //频率为50hz     
TIM3_PWM_Init(20000-1,84-1);
   while(1)
{
TIM_SetCompare1(TIM14,500);
delay_ms(1500);
TIM_SetCompare1(TIM14,1000);
delay_ms(1500);
TIM_SetCompare1(TIM14,1500);
delay_ms(1500);
TIM_SetCompare1(TIM14,2000);
delay_ms(1500);
TIM_SetCompare1(TIM14,2500);
delay_ms(1500);

}
while(1) //实现比较值从0-300递增,到300后从300-0递减,循环
{
TIM_SetCompare1(TIM3,500);
delay_ms(1500);
TIM_SetCompare1(TIM3,1000);
delay_ms(1500);
TIM_SetCompare1(TIM3,1500);
delay_ms(1500);
TIM_SetCompare1(TIM3,2000);
delay_ms(1500);
TIM_SetCompare1(TIM3,2500);
delay_ms(1500);

}
}

pwm.h的也整上来吧
#ifndef _TIMER_H
#define _TIMER_H
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F407开发板
//定时器 驱动代码   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2014/6/16
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved  
//////////////////////////////////////////////////////////////////////////////////

void TIM14_PWM_Init(u32 arr,u32 psc);
void TIM3_PWM_Init(u32 arr,u32 psc);

#endif


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
STM32新学习者
1楼-- · 2019-07-20 16:56
解决了没有 ,LZ,我的TIM3CH3好像也不能工作!!!
liangqin1573
2楼-- · 2019-07-20 21:27
楼主main函数里面怎么有2个while()循环?
只执行第一个while(1)里面的程序啊,因为跳不出去,一直在第一个while里面,所以你的TIM14起作用了
bg8wj
3楼-- · 2019-07-21 02:18
还是先好好学习一下C语言吧。

一周热门 更多>