OpenEdv-开源电子网

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

为什么PA2的PWM 一直没输出PWM。。看了很久没看出,只好求助

[复制链接]

26

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2015-12-7
在线时间
59 小时
发表于 2016-2-9 15:19:42 | 显示全部楼层 |阅读模式
10金钱
查看手册,PA2 有一个TIM2_CH3  定时器2 通道3.  我想用这个输出一个PWM. 但是一直都没反应..


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

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);// PA2
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);                                                                  
/*______________________________________________________*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &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(TIM2, &TIM_TimeBaseStructure);
/*______________________________________________________*/

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OC3Init(TIM2, &TIM_OCInitStructure);  
/*______________________________________________________*/
TIM_CtrlPWMOutputs(TIM2,ENABLE);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);  
TIM_ARRPreloadConfig(TIM2,ENABLE);  
TIM_Cmd(TIM2, ENABLE);  

}

主函数中: TIM2_PWM_Init(899,0);      TIM_SetCompare3(TIM2,YM);//YM从100递增到400再循环回去

最佳答案

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

/************************************************************************** 通用定时器2-5的PWM模式 定时器的时钟频率如下: AHB(72MHz)→APB1分频器(默认2)→APB1时钟信号(36MHz)→倍频器(*2倍)→通用定时器时钟信号(72MHz)。 因此CK_PSC就是72MHz了。 PWM的周期:是由定时器的自动重装值和CNT计数频率决定的。 而CNT的计数时钟是: CK_PSC经分频器PSC得到,因此CNT的时钟就是CK_P ...
< 主啊,请你温柔的笑吧 >
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2014-12-13
在线时间
89 小时
发表于 2016-2-9 15:19:43 | 显示全部楼层
/**************************************************************************
                      通用定时器2-5的PWM模式

定时器的时钟频率如下:
AHB(72MHz)→APB1分频器(默认2)→APB1时钟信号(36MHz)→倍频器(*2倍)→通用定时器时钟信号(72MHz)。
因此CK_PSC就是72MHz了。

PWM的周期:是由定时器的自动重装值和CNT计数频率决定的。
而CNT的计数时钟是:
CK_PSC经分频器PSC得到,因此CNT的时钟就是CK_PSC/分频系数。这个分频系数
在TIM_TimeBaseStructure.TIM_Prescaler确定。我设置的值是72,因此CNT的计数
频率也就是CK_CNT的频率为1MHz。
下一步就是确定定时器自动重装值。因为CNT每自加到ARR寄存器的值时就会自动清零,
当然前提是设定为为向上计数模式,而就是根据这个溢出事件来改变PWM的周期。所以
PWM信号的频率由ARR的值来确定。我设置的值是1000-1,
即TIM_TimeBaseStructure.TIM_Period = 1000-1;因此PWM的周期是1MHz/1000=1KHz。

***************************************************************************/


#include"pwm.h"

//---------------------------------------------------------------------------
//                                   定时器2PWM模式
// 定时器2和定时器5的通道重复占用CH1-PA0 CH2-PA1 CH3-PA2 CH4-PA3                         
// 定时器2的重映射端口 CH1-PA15 CH2-PB3 CH3-PB10 CH4-PB11
//---------------------------------------------------------------------------

void TIMER2_GPIO_config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
        //选择引脚PA0 PA1 PA2 PA3
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;         
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出频率最大50MHz
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_Init(GPIOA,&GPIO_InitStructure);

}

//通用定时器2初始化
//arr:自动重装值。
//psc:时钟预分频数
void TIMER2_config(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        //打开定时器时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        //重新将Timer设置为缺省值
        TIM_DeInit(TIM2);
        //采用内部时钟给TIM2提供时钟源
        TIM_InternalClockConfig(TIM2);
        //CK_PSC/分频系数,这样计数器时钟为72MHz/72 = 1MHz
        TIM_TimeBaseStructure.TIM_Prescaler = psc;
        //设置时钟分割
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        //设置计数器模式为向上计数模式
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        //设置计数溢出大小,每计2000个数就产生一个更新事件
        TIM_TimeBaseStructure.TIM_Period = arr-1;
        //将配置应用到TIM2中
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);       
          
        //使能ARR预装载缓冲器
        TIM_ARRPreloadConfig(TIM2, ENABLE);
}
void TIMER2_PWM_config(u16 Dutyfactor)
{
        TIM_OCInitTypeDef TimOCInitStructure;
        //设置缺省值
        TIM_OCStructInit(&TimOCInitStructure);
        //PWM模式1输出
        TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        //设置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100%
        TimOCInitStructure.TIM_Pulse = Dutyfactor;
        //TIM输出比较极性高
        TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        //使能输出状态
        TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        /*************通道1**************************/
        //根据参数初始化PWM寄存器
        TIM_OC1Init(TIM2, &TimOCInitStructure);
        //使能TIMx在CCR1上的预装载寄存器
        TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
        /*************通道2**************************/
        //根据参数初始化PWM寄存器
        TIM_OC2Init(TIM2, &TimOCInitStructure);
        //使能TIMx在CCR1上的预装载寄存器
        TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
        /*************通道3**************************/
        //根据参数初始化PWM寄存器
        TIM_OC3Init(TIM2, &TimOCInitStructure);
        //使能TIMx在CCR1上的预装载寄存器
        TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
        /*************通道4**************************/
        //根据参数初始化PWM寄存器
        TIM_OC4Init(TIM2, &TimOCInitStructure);
        //使能TIMx在CCR1上的预装载寄存器
        TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);

        //设置TIM2的PWM输出为使能
        TIM_CtrlPWMOutputs(TIM2,ENABLE);
        //使能定时器
        TIM_Cmd(TIM2, ENABLE);
}

/*****************************************************************************
  MCU:   STM32F103ZET6              晶振:8MHZ

  液晶:  R61505U  320X480
******************************************************************************/
#include"sys.h"
#include"usart.h"
#include "delay.h"
#include "tft.h"
#include "timer.h"
#include"pwm.h"

#define  Dutyfactor  2500         //占空比为12%

//变量定义
       

extern u16 tem1;
/*------------------------------------------------------------
                           主函数
------------------------------------------------------------*/
int main(void)
{       
       

        delay_init(72);        //延时初始化
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        TFT_Initial();//LCD初始化
        LCD_Clear(TFT_RED);
        //delay_ms(1000);
        TIM1_Int_Init(9,7199);//100ms
       
        TIMER2_GPIO_config();//
        TIMER2_config(20000,72);//72分频。PWM频率=1000000/19999=50hz
        TIMER2_PWM_config(Dutyfactor);

        TIMER3_GPIO_config();//
        TIMER3_config(20000,72);//72分频。PWM频率=1000000/19999=50hz
        TIMER3_PWM_config(Dutyfactor);

        TIMER4_GPIO_config();//
        TIMER4_config(20000,72);//72分频。PWM频率=1000000/19999=50hz
        TIMER4_PWM_config(Dutyfactor);

//        TIMER5_GPIO_config();//
//        TIMER5_config(20000,72);//72分频。PWM频率=1000000/19999=50hz
//        TIMER5_PWM_config(Dutyfactor);
       
        while(1)
        {
                LCD_ShowNum(10,50,tem1,5,32,TFT_YELLOW,TFT_RED);

                TIM_SetCompare1(TIM2,tem1);//设置TIM2捕获比较1寄存器值
                TIM_SetCompare2(TIM2,tem1);//设置TIM2捕获比较2寄存器值
                TIM_SetCompare3(TIM2,tem1);//设置TIM2捕获比较3寄存器值
                TIM_SetCompare4(TIM2,tem1);//设置TIM2捕获比较4寄存器值

                TIM_SetCompare1(TIM3,tem1);//设置TIM3捕获比较1寄存器值
                TIM_SetCompare2(TIM3,tem1);//设置TIM3捕获比较2寄存器值
                TIM_SetCompare3(TIM3,tem1);//设置TIM3捕获比较3寄存器值
                TIM_SetCompare4(TIM3,tem1);//设置TIM3捕获比较4寄存器值

                TIM_SetCompare1(TIM4,tem1);//设置TIM4捕获比较1寄存器值
                TIM_SetCompare2(TIM4,tem1);//设置TIM4捕获比较2寄存器值
                TIM_SetCompare3(TIM4,tem1);//设置TIM4捕获比较3寄存器值
                TIM_SetCompare4(TIM4,tem1);//设置TIM4捕获比较4寄存器值

//                TIM_SetCompare1(TIM5,tem1);//设置TIM4捕获比较1寄存器值
//                TIM_SetCompare2(TIM5,tem1);//设置TIM4捕获比较2寄存器值
//                TIM_SetCompare3(TIM5,tem1);//设置TIM4捕获比较3寄存器值
//                TIM_SetCompare4(TIM5,tem1);//设置TIM4捕获比较4寄存器值
        }
   
}
实验通过的
回复

使用道具 举报

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2013-11-27
在线时间
518 小时
发表于 2016-2-9 17:23:42 | 显示全部楼层
你知道什么是重映射吗?
回复

使用道具 举报

26

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2015-12-7
在线时间
59 小时
 楼主| 发表于 2016-2-9 17:51:04 | 显示全部楼层
wmh19910511 发表于 2016-2-9 17:23
你知道什么是重映射吗?

这个脚 TH2_CH3,没有在表格的Remap栏下啊、要重映射?
< 主啊,请你温柔的笑吧 >
回复

使用道具 举报

26

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2015-12-7
在线时间
59 小时
 楼主| 发表于 2016-2-9 18:05:22 | 显示全部楼层
本帖最后由 包子 于 2016-2-9 18:18 编辑

重映射大致就是IO口可以有多种用途,可以作为普通的输入输出口使用,也可以作为PWM通道使用,还有DAC通道等..

Remap栏目下面,有才是重映射. 我这个在默认的下面.

(不知道这图上不上的来=  =  STM32F1的芯片手册的PA2脚截图..
D`YEYE$D_67MFVE]3E3YM}5.png
< 主啊,请你温柔的笑吧 >
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 12:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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