OpenEdv-开源电子网

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

TIM3_CH1的PWM波怎么出不来

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-9-12
在线时间
0 小时
发表于 2013-9-12 19:03:14 | 显示全部楼层 |阅读模式
原子哥,我用库函数版本写的TIM3_CH1的PWM波怎么出不来啊?代码如下:
time.c文件
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_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);//使能GPIO外设和AFIO复用功能模块时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO, ENABLE);

//  GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);                        //Timer3部分重映射  TIM3_CH2->B5    
 
   /*设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;        //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);           //初始化GPIO

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;        //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);           //初始化GPIO
 
   /*初始化TIM3*/
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim,TIM3时钟为72MHZ
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
/*初始化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_High; //输出极性:TIM输出比较极性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
 
TIM_Cmd(TIM3, ENABLE);  //使能TIM3
}

main.c文件
int main(void)
 {
  u16 led0pwmval=2500;
u8 dir=1;
delay_init();           //延时函数初始化  
NVIC_Configuration();       //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
//uart_init(9600);           //串口初始化为9600
    LED_Init();       //LED端口初始化

  TIM3_PWM_Init(4999,7199);   //PWM频率=72000000/(5000*7200)=2hz,周期=0.5s
TIM_SetCompare2(TIM3,led0pwmval);//占空比50%
    TIM_SetCompare1(TIM3,led0pwmval);//占空比50%
    while(1);
//{
  //delay_ms(10);  
//if(dir)led0pwmval++;
//else led0pwmval--;

  //if(led0pwmval>300)dir=0;
//if(led0pwmval==0)dir=1;  
//TIM_SetCompare2(TIM3,led0pwmval);   
//}
 
 }
CH2的PWM波可以出来,但是CH1出不来啊,这是怎么回事呢?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2013-9-12 19:22:56 | 显示全部楼层
/*初始化TIM3 Channel2 WM模式*/  
这一部分  你只对CH2进行了设置,没对CH1设置
博观而约取,厚积而薄发。
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-12 19:20:30 | 显示全部楼层
仿真,看寄存器配置区别
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-9-12
在线时间
0 小时
 楼主| 发表于 2013-9-12 19:59:40 | 显示全部楼层
回复【3楼】745021926:

/*初始化TIM3 Channel2 WM模式*/  
这一部分  你只对CH2进行了设置,没对CH1设置

---------------------------------
这个注释我没有改,我觉得这一部分对CH1和CH2没有区别,都是可以用的,如果我把关于CH2的其他配置都屏蔽了,这段代码还在,CH1还是没有输出
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-9-12
在线时间
0 小时
 楼主| 发表于 2013-9-12 20:03:34 | 显示全部楼层
回复【4楼】xijiaqi:

回复【3楼】745021926:
/*初始化TIM3 Channel2 WM模式*/  
这一部分  你只对CH2进行了设置,没对CH1设置

---------------------------------
这个注释我没有改,我觉得这一部分对CH1和CH2没有区别,都是可以用的,如果我把关于CH2的其他配置都屏蔽了,这段代码还在,CH1还是没有输出

---------------------------------
我知道了,确实是这一块的问题,之前忽略了,还以为可以通用,不甚感激,我再改了试试,谢谢!
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-9-12
在线时间
0 小时
 楼主| 发表于 2013-9-12 20:06:12 | 显示全部楼层
可以了
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2013-9-12 20:58:03 | 显示全部楼层
回复【6楼】xijiaqi:
---------------------------------
恩,注意那个函数也要改
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2013-12-2
在线时间
0 小时
发表于 2014-11-18 19:43:04 | 显示全部楼层
回复【6楼】xijiaqi:
---------------------------------
 可以也不说问什么,这人!!
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

高级会员

Rank: 4

积分
877
金钱
877
注册时间
2015-11-5
在线时间
74 小时
发表于 2015-11-5 11:43:23 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
#include "timer.h"
#include "led.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//定时器 驱动代码    
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/4
//版本:V1.1
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved   
//********************************************************************************
//V1.1 20120904
//1,增加TIM3_PWM_Init函数。
//2,增加LED0_PWM_VAL宏定义,控制TIM3_CH2脉宽   
//////////////////////////////////////////////////////////////////////////////////  
      
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, 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(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

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

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

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

//TIM3 WM部分初始化 
//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_GPIOB | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->B5  TIM3_CH1->B4 
 
   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

/* GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO    */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PE5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &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 Channel2 WM模式  
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_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

//初始化TIM3 Channel1 WM模式  
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_OC1Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC1

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR1上的预装载寄存器
 
TIM_Cmd(TIM3, ENABLE);  //使能TIM3

}

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
//ALIENTEK战舰STM32开发板实验9
//PWM输出实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司 

 int main(void)
 {
  u16 led0pwmval=0;
u8 dir=1;
delay_init();       //延时函数初始化   
NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600);  //串口初始化为9600
  LED_Init();      //LED端口初始化
  TIM3_PWM_Init(899,0);  //不分频。PWM频率=72000/900=8Khz
while(1)
{
  delay_ms(10);  
if(dir)led0pwmval++;
else led0pwmval--;

  if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;  
            TIM_SetCompare2(TIM3,led0pwmval);
TIM_SetCompare1(TIM3,led0pwmval);   
}
 }

为什么LED0正常亮灭,但LED1一直常亮?(用跳线连接了PB4和PE5)
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-11-5 23:28:47 | 显示全部楼层
回复【9楼】STM32基础篇:
---------------------------------
PB4要先禁止jtag
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

高级会员

Rank: 4

积分
877
金钱
877
注册时间
2015-11-5
在线时间
74 小时
发表于 2015-11-6 17:04:41 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
已解决,谢谢原子哥
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2015-9-24
在线时间
4 小时
发表于 2016-4-11 17:04:06 | 显示全部楼层
原子哥,我用你的PWM的例程序,映射到PB0,没有波形输出,灯也不像程序里说的慢慢亮-慢慢弱。
//TIM3 PWM2¿·Ö3õê¼»ˉ
//PWMêä3ö3õê¼»ˉ
//arr£o×Ô¶ˉ֨װÖμ
//psc£oê±ÖóÔ¤·ÖÆμêy
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);        //ê1Äü¶¨ê±Æ÷3ê±Öó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //ê1ÄüGPIOíaéèoíAFIO¸′óÃ1|ÄüÄ£¿éê±Öó
       
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer32¿·ÖÖØó3éä  TIM3_CH2->B5   

   //éèÖøÃòy½ÅÎa¸′óÃêä3ö1|Äü,êä3öTIM3 CH2μ&#196WMÂö3å2¨DΠ       GPIOB.5
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM_CH2
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸′óÃíÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//3õê¼»ˉGPIO

   //3õê¼»ˉTIM3
        TIM_TimeBaseStructure.TIM_Period = arr; //éèÖÃÔúÏÂò»¸ö¸üDÂê¼t×°èë»î¶ˉμÄ×Ô¶ˉÖØ×°ÔØ¼Ä′æÆ÷ÖüÆúμÄÖμ
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //éèÖÃóÃà′×÷ÎaTIMxê±ÖóÆμÂê3yêyμÄÔ¤·ÖÆμÖμ
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòéϼÆêyÄ£ê½
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ
       
        //3õê¼»ˉTIM3 Channel2 PWMģ꽠        
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //Ñ¡Ôñ¶¨ê±Æ÷Ä£ê½:TIMÂö3å¿í¶èμ÷ÖÆÄ£ê½2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è½Ïêä3öê1Äü
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //êä3ö¼«DÔ:TIMêä3ö±è½Ï¼«DÔ¸ß
        TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //¸ù¾YTÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèTIM3 OC2

        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //ê1ÄüTIM3ÔúCCR2éÏμÄÔ¤×°ÔØ¼Ä′æÆ÷

        TIM_Cmd(TIM3, ENABLE);  //ê1ÄüTIM3
}

int main(void)
{               
        u16 led0pwmval=0;
        u8 dir=1;       
        delay_init();                       //Ñóê±oˉêy3õê¼»ˉ          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //éèÖÃNVICÖD¶Ï·Ö×é2:2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
        uart_init(115200);           //′®¿ú3õê¼»ˉÎa115200
        LED_Init();                               //LED¶Ë¿ú3õê¼»ˉ
         
        //TIM3_Int_Init(199,7199);
        //TIM3_PWM_Init(4999,7199);         //2»·ÖÆμ¡£PWMÆμÂê=72000000/900=80Khz
         
        //TIM3_Int_Init(10000,8400);
        TIM3_PWM_Init(899,0);         //2»·ÖÆμ¡£PWMÆμÂê=72000000/900=80Khz
        //TIM3_Int_Init(99,71);
        //TIM3_PWM_Init(99,71);         //2»·ÖÆμ¡£PWMÆμÂê=72000000/900=80Khz
        while(1)
        { //LED1=~LED1;
                delay_ms(10);         
                if(dir)led0pwmval++;
                else led0pwmval--;

                if(led0pwmval>300)dir=0;
                if(led0pwmval==0)dir=1;                                                                                 
                TIM_SetCompare2(TIM3,led0pwmval);                  
    //TIM_SetCompare1(TIM3,led0pwmval);                       
                //LED0=~LED0;
                //LED1=~LED1;
        }         
}

用示波器测也没有波形~~
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-11 06:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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