OpenEdv-开源电子网

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

STM32有关TIM3产生4路PWM的问题。

[复制链接]

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-9-21
在线时间
2 小时
发表于 2014-9-13 21:54:34 | 显示全部楼层 |阅读模式
5金钱
原子哥。我想问下,我找别人的程序和你的库函数的程序拿来对照,发现修改了输出通道,对应的IO口并没有输出。给你贴程序你看下

void TIM3_PWM_Init(u16 arr,u16 psc)
{  
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;   //对应CH3通道PB0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); 
 
TIM_TimeBaseStructure.TIM_Period = arr;  
TIM_TimeBaseStructure.TIM_Prescaler =psc; 
TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 
  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  

 TIM_OC3Init(TIM3, &TIM_OCInitStructure);        
 TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); 
 
TIM_Cmd(TIM3, ENABLE);  

}
上面的我试了很多次。就是没有输出。很是纳闷。
下面的这个也是。
这是我下载别人的:
//TIM3 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{  
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //Timer3 部重映射 
   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; // PWM2 ~ PWM4

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO
 
   //初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

//初始化TIM3 Channel1 PWM模式  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
 
//初始化TIM3 Channel2 PWM模式  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
 
//初始化TIM3 Channel3 PWM模式  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
 
//初始化TIM3 Channel4 PWM模式  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
 
TIM_Cmd(TIM3, ENABLE);  //使能TIM3
}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


/*====== 通用定时器4中断初始化 ======*/
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器4!
void TIM4_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断

NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM4中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =2;  //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;  //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

TIM_Cmd(TIM4, ENABLE);  //使能TIMx外设  
}

/* ====== 定时器4中断服务程序 ======*/
void TIM4_IRQHandler(void)   //TIM4中断
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源
}
}


/*====== TIM4 PWM 部分初始化 ======*/ 
// TIM4_CH1 PB6 PWM3 (heater)
// TIM4_CH2 PB7 PWM
// TIM4_CH4 PB8 PWM
// TIM4_CH4 PB9 PWM

//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM4_PWM_Init(u16 arr,u16 psc) 
{  
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
GPIO_PinRemapConfig(GPIO_Remap_TIM4, DISABLE); //TIM4复用功能映射  TIM4_CH2->B5    
   //设置该引脚为复用输出功能,输出TIM4 CH1的PWM脉冲波形 GPIOB.6
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
 
/*====== 初始化TIM4 ======*/
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


/*====== 初始化TIM4 Channel1 PWM模式 Heater 12~17======*/ 
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //TIM_OCPolarity_High 输出极性:TIM输出比较极性高
// TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCPolarity_Low 输出极性:TIM输出比较极性低
TIM_OC1Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC1
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR1上的预装载寄存器
 
 /*=================================
/====== 初始化TIM4 Channel2 PWM模式 ======/  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
//TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCPolarity_Low 输出极性:TIM输出比较极性低
TIM_OC2Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC2
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR2上的预装载寄存器
 
/====== 初始化TIM4 Channel3 PWM模式 ======/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式3
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC3Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC3
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR3上的预装载寄存器
 
/====== //初始化TIM4 Channel4 PWM模式 ======/  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式4
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC4Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC4
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR4上的预装载寄存器
 ===================================*/

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




最佳答案

查看完整内容[请看2#楼]

已解决。谢谢原子和fresh杰尼龟 。哈哈。小问题。坑了我好久。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-9-21
在线时间
2 小时
 楼主| 发表于 2014-9-13 21:54:35 | 显示全部楼层
已解决。谢谢原子和fresh杰尼龟 。哈哈。小问题。坑了我好久。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-9-14 00:16:13 | 显示全部楼层
 论坛 有寄存器的例子,你可以参考下:
http://www.openedv.com/posts/list/22736.htm
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-9-21
在线时间
2 小时
 楼主| 发表于 2014-9-14 08:52:19 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我只是想用库函数实现它,寄存器的我试过了。我就是在想为什么库函数不能输出。很不解
回复

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2014-4-26
在线时间
0 小时
发表于 2014-9-14 09:21:47 | 显示全部楼层
你两部分程序怎么上面是TIM3的,下面是TIM4的?
你是在正点原子的程序上做修改的吗?还是自己编写的程序?
不努力,就什么也得不到
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-9-21
在线时间
2 小时
 楼主| 发表于 2014-9-14 10:30:22 | 显示全部楼层
回复【4楼】fresh杰尼龟:
---------------------------------
前面的是正点改的,后面的网友的,我贴上来的,后面的这个也不对。
回复

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2014-4-26
在线时间
0 小时
发表于 2014-9-14 10:48:14 | 显示全部楼层
回复【5楼】shanyuze:
---------------------------------
用正点的改的应该是没错的,你再看看自己还修改过哪里,找出了。
如果还没找到原因就测试一下是否硬件电路有问题。找别人的能正常使用的板来测试下。
不努力,就什么也得不到
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-9-21
在线时间
2 小时
 楼主| 发表于 2014-9-14 11:27:40 | 显示全部楼层
回复【6楼】fresh杰尼龟:
---------------------------------
最上面的我的程序,里面红色的地方是我改过的。。但是没有输出。应该不是硬件问题。
回复

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2014-4-26
在线时间
0 小时
发表于 2014-9-14 15:27:36 | 显示全部楼层
回复【8楼】shanyuze:
---------------------------------
嗯嗯,刚开始很多小问题,后面就不会了
这样自己解决也会很有成就感吧~哈哈
不努力,就什么也得不到
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-9-21
在线时间
2 小时
 楼主| 发表于 2014-9-14 17:49:12 | 显示全部楼层
回复【9楼】fresh杰尼龟:
---------------------------------
哈哈。只感觉自己很2B。哈哈
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2014-10-6
在线时间
1 小时
发表于 2014-10-6 13:58:20 | 显示全部楼层
回复【8楼】shanyuze:
---------------------------------
求解 遇到同样的问题 不知问题出在哪里
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-1-19
在线时间
0 小时
发表于 2014-10-7 04:13:15 | 显示全部楼层
回复【11楼】HBY:
---------------------------------
 检查是否使能了定时器的时钟和定时器本身,上次就是忘了开时钟纠结了好久。
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-9-21
在线时间
2 小时
 楼主| 发表于 2015-1-13 11:03:53 | 显示全部楼层
不是,主程序中,还要设置PWM输出的。你主程序没加?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-6-29
在线时间
2 小时
发表于 2015-3-25 15:15:39 | 显示全部楼层
你好,楼主请问你的后来是怎么解决的?我现在碰到同样的问题,急
回复

使用道具 举报

4

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2015-3-11
在线时间
0 小时
发表于 2015-4-14 15:55:35 | 显示全部楼层
本人想利用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

回复

使用道具 举报

12

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2015-7-14
在线时间
23 小时
发表于 2015-7-21 01:18:18 | 显示全部楼层
回复【13楼】shanyuze:
---------------------------------
请问是怎么解决的   非常感谢
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2015-7-22
在线时间
0 小时
发表于 2015-7-28 09:08:04 | 显示全部楼层
为什么我的库中TIM_OCInitTypeDef里面会有这么多项呢,都是干嘛的啊
TIM_OCInitTypeDef
{
    uint16_t  TIM_OCIdleState 
    uint16_t  TIM_OCMode 
    uint16_t  TIM_OCNIdleState 
    uint16_t  TIM_OCNPolarity 
    uint16_t  TIM_OCPolarity 
    uint16_t  TIM_OutputNState 
    uint16_t  TIM_OutputState 
    uint16_t  TIM_Pulse 
}

而且编译的时候报错了
..\USER\timer.c(71): error:  #167: argument of type "TIM_OCInitTypeDef" is incompatible with parameter of type "TIM_OCInitTypeDef *"
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2015-7-22
在线时间
0 小时
发表于 2015-7-28 13:12:49 | 显示全部楼层
回复【17楼】松子:
---------------------------------
问题解决了,不过那几个带N的项是干嘛用的啊
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-1-6
在线时间
3 小时
发表于 2016-4-21 12:28:05 | 显示全部楼层
shanyuze 发表于 2014-9-13 21:54
已解决。谢谢原子和fresh杰尼龟 。哈哈。小问题。坑了我好久。

请问楼主怎么解决的?我看不出来代码了问题在哪里
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-5-1
在线时间
3 小时
发表于 2016-7-17 12:31:41 | 显示全部楼层
我遇到了CH1,CH2输出正常。CH3,CH4不输出的情况。
MCU是STM32F103
原因也比较那个...你懂的。
CH1和CH2在PA上,CH3,CH4在PB上,首先检查是否把PA,PB都使能了。
然后PA,PB都是挂载在APB2下的。我发现我这里写错了,写成APB1使能PA,PB。
但是PA也使能错了,却可以输出,原因大概是LED使能的时候有把PA正确使能过了(懒得验证)。
希望后面的人遇到的也是这个问题,这样就能愉快地解决了。
(APB1,APB2在哪? 没错,我愿意多打几个字,却懒得复制粘贴代码上来
回复

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2017-1-15
在线时间
19 小时
发表于 2017-3-2 11:43:28 | 显示全部楼层
请问,楼主最终如何解决。
回复

使用道具 举报

9

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-3-7
在线时间
25 小时
发表于 2017-7-6 14:40:04 | 显示全部楼层
我的是通道1也就是PB4输出有问题,一直是高电平,不知道是什么原因
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2017-10-31
在线时间
6 小时
发表于 2018-5-7 10:16:54 | 显示全部楼层
809659312 发表于 2017-7-6 14:40
我的是通道1也就是PB4输出有问题,一直是高电平,不知道是什么原因

PB4是JTAG的复位引脚吧
使用之前先关掉其JTAG功能
类似于一下操作,AFIO时钟一定要打开,否则无效
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE) ; 关闭JTAG,保留SW做调试用
回复

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2018-10-23
在线时间
11 小时
发表于 2018-10-27 14:29:48 | 显示全部楼层
JYF 发表于 2018-5-7 10:16
PB4是JTAG的复位引脚吧
使用之前先关掉其JTAG功能
类似于一下操作,AFIO时钟一定要打开,否则无效

谢谢
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2019-11-22
在线时间
21 小时
发表于 2021-2-25 17:19:28 | 显示全部楼层
请问楼主怎么解决的

回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-12-7
在线时间
8 小时
发表于 2021-7-12 17:25:47 | 显示全部楼层
进步人 发表于 2021-2-25 17:19
请问楼主怎么解决的

看楼主的代码 大概是占空比搞错了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 15:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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