OpenEdv-开源电子网

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

我的是迷你板,跟着原子哥的pwm例程做,不知道为什么编译通过了,可输不出pwm波,求大神解疑

[复制链接]

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2019-4-24
在线时间
28 小时
发表于 2019-4-30 15:56:48 | 显示全部楼层 |阅读模式
1金钱
#include "timer.h"

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

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                 //LED0-->PA.8 ¶Ë¿úÅäÖÃ
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                  //íÆíìêä3ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO¿úËù¶èÎa50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //¸ù¾Yé趨2Îêy3õê¼»ˉGPIOA.8

        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
       
  TIM_TimeBaseInitStructure.TIM_ClockDivision=0;
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStructure.TIM_Period=arr;
        TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);

       
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
        TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = 0; //éèÖÃ′y×°èë2¶»ñ±è½Ï¼Ä′æÆ÷μÄÂö3åÖμ
        TIM_OC2Init(TIM3,&TIM_OCInitStructure);       


        TIM_CtrlPWMOutputs(TIM3,ENABLE);
       
        TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
       
        TIM_ARRPreloadConfig(TIM3,ENABLE);
       
        TIM_Cmd(TIM3,ENABLE);
}

int main(void)
{       
        u16 led0pwmval=0;   
        u8 dir=1;       
        delay_init();                     //Ñóê±oˉêy3õê¼»ˉ          
        LED_Init();                          //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
        TIM3_PWM_Init(899,0);//2»·ÖÆμ¡£PWMÆμÂê=72000/(899+1)=80Khz
           while(1)
        {
                delay_ms(10);         
                if(dir)led0pwmval++;
                else led0pwmval--;         
                if(led0pwmval>300)dir=0;
                if(led0pwmval==0)dir=1;                                                    
                TIM_SetCompare1(TIM3,led0pwmval);          
        }
}



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

使用道具 举报

22

主题

271

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
405
金钱
405
注册时间
2019-3-21
在线时间
107 小时
发表于 2019-4-30 15:58:54 | 显示全部楼层
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-4-30 16:39:26 | 显示全部楼层
参考附件

MINI TIM34路PWM输出(PA6,PA7,PB0,PB1).rar

2.16 MB, 下载次数: 24

回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2019-4-24
在线时间
28 小时
 楼主| 发表于 2019-4-30 17:39:45 | 显示全部楼层

pwm也需要中断函数控制么,可我看原子哥的例程里没用啊
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2019-4-24
在线时间
28 小时
 楼主| 发表于 2019-4-30 18:10:31 | 显示全部楼层

还是不行,就算是把原子哥给的程序改成TIM3和OC2也不行
这是原子哥的例程的程序
int main(void)
{       
        u16 led0pwmval=0;   
        u8 dir=1;       
        delay_init();                     //Ñóê±oˉêy3õê¼»ˉ          
        LED_Init();                          //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
        TIM1_PWM_Init(899,0);//2»·ÖÆμ¡£PWMÆμÂê=72000/(899+1)=80Khz
           while(1)
        {
                delay_ms(10);         
                if(dir)led0pwmval++;
                else led0pwmval--;         
                if(led0pwmval>300)dir=0;
                if(led0pwmval==0)dir=1;                                                    
                TIM_SetCompare1(TIM1,led0pwmval);          
        }
}



#include "pwm.h"
#include "led.h"
//////////////////////////////////////////////////////////////////////////////////         
//±¾3ìDòÖ»1©Ñ§Ï°ê1óã¬Î′¾-×÷ÕßDí¿é£¬2»μÃóÃóúÆäËüèÎoÎóÃí¾
//ALIENTEK Mini STM32¿a·¢°å
//PWM  Çy¶ˉ′úÂë                          
//ÕyμãÔ-×ó@ALIENTEK
//¼¼êõÂÛì3:www.openedv.com
//DT¸ÄèÕÆú:2010/12/03
//°æ±¾£oV1.0
//°æè¨ËùóD£¬μá°æ±Ø¾¿¡£
//Copyright(C) ÕyμãÔ-×ó 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////           


//PWMêä3ö3õê¼»ˉ
//arr£o×Ô¶ˉ֨װÖμ
//psc£oê±ÖóÔ¤·ÖÆμêy
void TIM1_PWM_Init(u16 arr,u16 psc)
{  
         GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //ê1ÄüGPIOíaéèê±Öóê1Äü
                                                                                    

   //éèÖøÃòy½ÅÎa¸′óÃêä3ö1|Äü,êä3öTIM1 CH1μ&#196WMÂö3å2¨DÎ
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //¸′óÃíÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

       
        TIM_TimeBaseStructure.TIM_Period = arr; //éèÖÃÔúÏÂò»¸ö¸üDÂê¼t×°èë»î¶ˉμÄ×Ô¶ˉÖØ×°ÔØ¼Ä′æÆ÷ÖüÆúμÄÖμ         80K
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //éèÖÃóÃà′×÷ÎaTIMxê±ÖóÆμÂê3yêyμÄÔ¤·ÖÆμÖμ  2»·ÖÆμ
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòéϼÆêyÄ£ê½
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ


        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //Ñ¡Ôñ¶¨ê±Æ÷Ä£ê½:TIMÂö3å¿í¶èμ÷ÖÆÄ£ê½2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è½Ïêä3öê1Äü
        TIM_OCInitStructure.TIM_Pulse = 0; //éèÖÃ′y×°èë2¶»ñ±è½Ï¼Ä′æÆ÷μÄÂö3åÖμ
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //êä3ö¼«DÔ:TIMêä3ö±è½Ï¼«DÔ¸ß
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //¸ù¾YTIM_OCInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèTIMx

  TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE Ö÷êä3öê1Äü       

        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1Ô¤×°ÔØê1Äü         
       
        TIM_ARRPreloadConfig(TIM1, ENABLE); //ê1ÄüTIMxÔúARRéÏμÄÔ¤×°ÔØ¼Ä′æÆ÷
       
        TIM_Cmd(TIM1, ENABLE);  //ê1ÄüTIM1

   
}
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2019-4-24
在线时间
28 小时
 楼主| 发表于 2019-4-30 18:14:42 | 显示全部楼层
只是我改了的
int main(void)
{       
        u16 led0pwmval=0;   
        u8 dir=1;       
        delay_init();                      
        LED_Init();                         
        TIM3_PWM_Init(899,0);
           while(1)
        {
                delay_ms(10);         
                if(dir)led0pwmval++;
                else led0pwmval--;         
                if(led0pwmval>300)dir=0;
                if(led0pwmval==0)dir=1;                                                    
                TIM_SetCompare2(TIM1,led0pwmval);          
        }
}



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_GPIOA , ENABLE);  
                                                                                    
   
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        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(TIM1, &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_OC2Init(TIM3, &TIM_OCInitStructure);  

        TIM_CtrlPWMOutputs(TIM3,ENABLE);
        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);   
       
        TIM_ARRPreloadConfig(TIM3, ENABLE);
       
        TIM_Cmd(TIM3, ENABLE);  

   
}
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2019-4-24
在线时间
28 小时
 楼主| 发表于 2019-4-30 18:15:38 | 显示全部楼层
打错字了,是“这”
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-4-29
在线时间
6 小时
发表于 2019-5-1 18:13:04 | 显示全部楼层
HYTROGEN 发表于 2019-4-30 18:15
打错字了,是“这”

啥意思?

回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2019-4-24
在线时间
28 小时
 楼主| 发表于 2019-5-2 15:57:34 | 显示全部楼层

就只是打错字了,这不重要
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-4-29
在线时间
6 小时
发表于 2019-5-5 14:56:52 | 显示全部楼层
HYTROGEN 发表于 2019-4-30 17:39
pwm也需要中断函数控制么,可我看原子哥的例程里没用啊

pwm不需要中断函数控制吧,我没写也改变了输出的PWM占空比

题主在TIM3部分重映射( GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);  )
        之前有给AFIO时钟使能吗??
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 21:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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