OpenEdv-开源电子网

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

STM32F0 TIM1定时器输出PWM问题

[复制链接]

5

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
418
金钱
418
注册时间
2020-8-25
在线时间
76 小时
发表于 2021-6-29 14:13:18 | 显示全部楼层 |阅读模式
5金钱
本人移植原公司程序,F1的移植到FO的,原先配置的是TIM2,现在硬件接的是TIM1 PA8(TIM1_CH1) PA9(TIM2_CH2),按照手册配置后,PWM输出极性与实际不符,两套程序,一套正常一套输出极性相反。具体PWM及定时器部分代码如下。
void TIM1_BASE_Configuration(void)//定时器1 PWM
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
       
  TIM_TimeBaseStructure.TIM_Period = 3000; //3000
  TIM_TimeBaseStructure.TIM_Prescaler = 2;//2 32M/3000/3=约3.55KHz.
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;//
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//
       
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//
  TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//
       
//  TIM_ITConfig(TIM1, TIM_IT_Update , ENABLE);//
//  TIM_Cmd(TIM1, ENABLE);//
       
}

void TIM1_CHANNEL_Configuration(void)
{
        TIM_OCInitTypeDef TIM_OCInitStructure; //
/**********************************************************/
          /* PWM1 Mode configuration: Channel4 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为无效电平;否则为有效电平
                                                     //TIM_OCMode_PWM1; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为有效电平;否则为无效电平
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;  //互补输出使能。开启OC*N输出到对应引脚
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //比较输出有效电平选择,Low
                                                        //TIM_OCPolarity_Low; //比较输出有效电平选择,High
  TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;         
//  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
//  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //
       
  /******************************  ******************************/
  /* PWM1 Mode configuration: Channel5 */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为无效电平;否则为有效电平
                                                            //TIM_OCMode_PWM1; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为有效电平;否则为无效电平
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val; //
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //比较输出有效电平选择,
                                           //TIM_OCPolarity_Low;   //比较输出有效电平选择,Low
  TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;       
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;         
//  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
//  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  TIM_OC2Init(TIM1, &TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //



   TIM_ARRPreloadConfig(TIM1, ENABLE); //

   TIM_ITConfig(TIM1, TIM_IT_Update , ENABLE);//
   TIM_Cmd(TIM1, ENABLE);//

   TIM_CtrlPWMOutputs(TIM1,ENABLE);//新添加 一般的定时器用不到,高级定时器,比如TIM1还有TIM8才用的到

}


主程序里边对PWM赋值:
        TIM_SetCompare2(TIM1,testdata);//Extfan.PWMvalue);
        TIM_SetCompare1(TIM1,testdata);//Intfan.PWMvalue);


按照手册,设置PWM1及有效电平为高时: CNT<CCR有效
                                                             CNT>CCR无效
                设置PWM2及有效电平为高时: CNT>CCR有效  
                                                             CNT<CCR无效

以上配置成PWM2模式,有效电平为高。 PWM的CCR值范围0-3000;
当CCR值为0时,CNT>CCR 有效 CNT值只要大于0满足应该持续输出高电平,但实际持续输出低电平
当CCR值为3000时,CNT>CCR有效 CNT值都小于3000,应该持续输出低电平,但实际输出高电平。

疑问的是原先老的F1持续就是配置PWM2,有效电平为高。但是实际这种方式是不符合手册的,
然后移植另外一款持续,同样是STM32F030C8T6的,底层配置一样,但是满足手册的描述情况,上头要求查出来到底哪边出问题,用Bcompare对比两个030程序,底层驱动配置是一样的,就PWM1和PWM2区别,有遇到这种问题的吗?百度没搜到类似问题,急!求助!

PWM配置

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

使用道具 举报

5

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
418
金钱
418
注册时间
2020-8-25
在线时间
76 小时
 楼主| 发表于 2021-6-29 14:16:57 | 显示全部楼层
  1. 符合手册的那个程序STM32F030
  2. void TIM1_BASE_Configuration(void)//定时器2 PWM
  3. {
  4.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  5.        
  6.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  7.        
  8.   TIM_TimeBaseStructure.TIM_Period = 3000; //3000
  9.   TIM_TimeBaseStructure.TIM_Prescaler = 2;//2 32M/3000/3=约3.55KHz.
  10.   TIM_TimeBaseStructure.TIM_ClockDivision = 0;//
  11.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//
  12.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//
  13.        
  14.   TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//
  15.   TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//
  16.        
  17.   TIM_ITConfig(TIM1, TIM_IT_Update , ENABLE);//
  18.   TIM_Cmd(TIM1, ENABLE);//
  19.        
  20. }

  21. void TIM1_CHANNEL_Configuration(void)
  22. {
  23.         TIM_OCInitTypeDef TIM_OCInitStructure; //
  24. /**********************************************************/
  25.           /* PWM1 Mode configuration: Channel4 */
  26.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为无效电平;否则为有效电平
  27.                                        //TIM_OCMode_PWM1; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为有效电平;否则为无效电平
  28.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM
  29.         //TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;  //互补输出使能。开启OC*N输出到对应引脚
  30.   TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //
  31.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //比较输出有效电平选择,Low
  32.                                            //TIM_OCPolarity_Low; //比较输出有效电平选择,High
  33.         //TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;         
  34.   //TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  35.   //TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  36.   TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  37.   TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //
  38.        
  39.   /******************************  ******************************/
  40.   /* PWM1 Mode configuration: Channel5 */
  41.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为无效电平;否则为有效电平
  42.                                        //TIM_OCMode_PWM1; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为有效电平;否则为无效电平
  43.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM
  44.         //TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  45.   TIM_OCInitStructure.TIM_Pulse = CCR2_Val; //
  46.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //比较输出有效电平选择,
  47.                                            //TIM_OCPolarity_Low;   //比较输出有效电平选择,Low
  48.         //TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;         
  49.   //TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  50.   //TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;   
  51.   TIM_OC2Init(TIM1, &TIM_OCInitStructure);
  52.   TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //
  53.        
  54.         TIM_ARRPreloadConfig(TIM1, ENABLE); //
  55.        
  56.         /* Automatic Output enable, Break, dead time and lock configuration*/ //互补方式输出时候配置
  57.   // TIM_OCInitTypeDef.TIM_OSSRState = TIM_OSSRState_Enable;
  58.   // TIM_OCInitTypeDef.TIM_OSSIState = TIM_OSSIState_Enable;
  59.   // TIM_OCInitTypeDef.TIM_LOCKLevel = TIM_LOCKLevel_1;
  60.   // TIM_OCInitTypeDef.TIM_DeadTime = 0x75;
  61.   // TIM_OCInitTypeDef.TIM_Break = TIM_Break_Enable;
  62.   // TIM_OCInitTypeDef.TIM_BreakPolarity = TIM_BreakPolarity_High;
  63.   // TIM_OCInitTypeDef.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  64.   // TIM_BDTRConfig(TIM2,&TIM2_BDTRInitStructure);
  65.         TIM_CtrlPWMOutputs(TIM1,ENABLE);//新添加 一般的定时器用不到,高级定时器,比如TIM1还有TIM8才用的到
  66.         TIM_Cmd(TIM1, ENABLE);//新添加 上边已经配置
  67. }
复制代码
回复

使用道具 举报

5

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
418
金钱
418
注册时间
2020-8-25
在线时间
76 小时
 楼主| 发表于 2021-6-29 14:18:27 | 显示全部楼层
  1. PWM输出与手册不符的
  2. void TIM1_BASE_Configuration(void)//定时器1 PWM
  3. {
  4.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  5.        
  6.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  7.        
  8.   TIM_TimeBaseStructure.TIM_Period = 3000; //3000
  9.   TIM_TimeBaseStructure.TIM_Prescaler = 2;//2 32M/3000/3=约3.55KHz.
  10.   TIM_TimeBaseStructure.TIM_ClockDivision = 0;//
  11.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//
  12.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//
  13.        
  14.   TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//
  15.   TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//
  16.        
  17.   TIM_ITConfig(TIM1, TIM_IT_Update , ENABLE);//
  18.   TIM_Cmd(TIM1, ENABLE);//
  19.        
  20. }

  21. void TIM1_CHANNEL_Configuration(void)
  22. {
  23.         TIM_OCInitTypeDef TIM_OCInitStructure; //
  24. /**********************************************************/
  25.           /* PWM1 Mode configuration: Channel4 */
  26.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为无效电平;否则为有效电平
  27.                                        //TIM_OCMode_PWM1; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为有效电平;否则为无效电平
  28.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM
  29.         //TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;  //互补输出使能。开启OC*N输出到对应引脚
  30.   TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //
  31.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //比较输出有效电平选择,Low
  32.                                            //TIM_OCPolarity_Low; //比较输出有效电平选择,High
  33.         //TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;         
  34.   //TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  35.   //TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  36.   TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  37.   TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //
  38.        
  39.   /******************************  ******************************/
  40.   /* PWM1 Mode configuration: Channel5 */
  41.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为无效电平;否则为有效电平
  42.                                        //TIM_OCMode_PWM1; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为有效电平;否则为无效电平
  43.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM
  44.         //TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  45.   TIM_OCInitStructure.TIM_Pulse = CCR2_Val; //
  46.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //比较输出有效电平选择,
  47.                                            //TIM_OCPolarity_Low;   //比较输出有效电平选择,Low
  48.         //TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;         
  49.   //TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  50.   //TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;   
  51.   TIM_OC2Init(TIM1, &TIM_OCInitStructure);
  52.   TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //
  53.        
  54.         TIM_ARRPreloadConfig(TIM1, ENABLE); //
  55.        
  56.         /* Automatic Output enable, Break, dead time and lock configuration*/ //互补方式输出时候配置
  57.   // TIM_OCInitTypeDef.TIM_OSSRState = TIM_OSSRState_Enable;
  58.   // TIM_OCInitTypeDef.TIM_OSSIState = TIM_OSSIState_Enable;
  59.   // TIM_OCInitTypeDef.TIM_LOCKLevel = TIM_LOCKLevel_1;
  60.   // TIM_OCInitTypeDef.TIM_DeadTime = 0x75;
  61.   // TIM_OCInitTypeDef.TIM_Break = TIM_Break_Enable;
  62.   // TIM_OCInitTypeDef.TIM_BreakPolarity = TIM_BreakPolarity_High;
  63.   // TIM_OCInitTypeDef.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  64.   // TIM_BDTRConfig(TIM2,&TIM2_BDTRInitStructure);
  65.         TIM_CtrlPWMOutputs(TIM1,ENABLE);//新添加 一般的定时器用不到,高级定时器,比如TIM1还有TIM8才用的到
  66.         TIM_Cmd(TIM1, ENABLE);//新添加 上边已经配置
  67. }
复制代码
回复

使用道具 举报

5

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
418
金钱
418
注册时间
2020-8-25
在线时间
76 小时
 楼主| 发表于 2021-6-29 14:21:35 | 显示全部楼层
file:///C:/Users/Qineng/Desktop/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20210629142045.png
回复

使用道具 举报

5

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
418
金钱
418
注册时间
2020-8-25
在线时间
76 小时
 楼主| 发表于 2021-6-29 14:22:31 | 显示全部楼层
  1. IO引脚配置都是相同的
  2. /* Configure (PA8、PA9) as input Low-pull */
  3.   /*PA8: TM1_CH1, ExtFan PWM; PA9: TM1_CH2, IntFan PWM; 风扇PWM控制*/
  4.   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8|GPIO_Pin_9;
  5.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  6.   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  7.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  8.         GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
  9.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  10.   
  11.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource8,  GPIO_AF_2);
  12.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,  GPIO_AF_2);
复制代码
回复

使用道具 举报

5

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
418
金钱
418
注册时间
2020-8-25
在线时间
76 小时
 楼主| 发表于 2021-6-29 14:27:48 | 显示全部楼层
@正点原子 求助原子哥
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2021-6-30 02:19:40 | 显示全部楼层
你是说在F1上面正常,在F0上面就反向了?
这个不是很简单么,你改下代码,改下输出极性设置就醒了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
418
金钱
418
注册时间
2020-8-25
在线时间
76 小时
 楼主| 发表于 2021-6-30 08:42:44 | 显示全部楼层
正点原子 发表于 2021-6-30 02:19
你是说在F1上面正常,在F0上面就反向了?
这个不是很简单么,你改下代码,改下输出极性设置就醒了

两个代码,都是从F1移植到F0的,有一个是正常的,另外一个输出极性反了,今天用调试直接查寄存器看看,是不是哪边影响了。
回复

使用道具 举报

5

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
418
金钱
418
注册时间
2020-8-25
在线时间
76 小时
 楼主| 发表于 2021-6-30 14:09:03 | 显示全部楼层
@正点原子 原子哥,我大概定位到问题了,但是不理解为什么会这样,
这个工程PWM的时钟和IO配置是分三个函数初始化的,这样会造成不管CCxP寄存器的值不管设置高或者低都是1(1:低有效 0:高有效  设置高有效无用),但是其他工程都是这样配置的,
IO口配置,具体应用配置都是分开卸载不同函数里的,就这一个有问题,搞不清楚了,有没有解决思路
下面是我放一起的代码:
void TIM1_CHANNEL_Configuration(void)
{
  
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE);  
  /* Configure (PA8、PA9) as input Low-pull */
  /*PA8: TM1_CH1, ExtFan PWM; PA9: TM1_CH2, IntFan PWM; 风扇PWM控制*/
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8|GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource8,  GPIO_AF_2);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,  GPIO_AF_2);
  
       
  TIM_TimeBaseStructure.TIM_Period = 3000-1; //3000
  TIM_TimeBaseStructure.TIM_Prescaler = 2;//2 32M/3000/3=约3.55KHz.
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;//
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//
       
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//
  
        TIM_OCInitTypeDef TIM_OCInitStructure; //
/**********************************************************/
          /* PWM1 Mode configuration: Channel4 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为无效电平;否则为有效电平
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //比较输出有效电平选择,Low
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);       
  /******************************  ******************************/
  /* PWM1 Mode configuration: Channel5 */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为无效电平;否则为有效电平
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //比较输出有效电平选择,   
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val; //
  TIM_OC2Init(TIM1, &TIM_OCInitStructure);
  
  TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能        高级定时器TIM1 TIM8需要配置

  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能         
  TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能         
  
  TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
  
  TIM_Cmd(TIM1, ENABLE);

}
下面是我分开的代码:
IO口时钟开了,还要其他很多IO口的额我省略了:
IO口配置:
/* Configure (PA8、PA9) as input Low-pull */
  /*PA8: TM1_CH1, ExtFan PWM; PA9: TM1_CH2, IntFan PWM; 风扇PWM控制*/
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8|GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource8,  GPIO_AF_2);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,  GPIO_AF_2);


TIM1配置
void TIM1_BASE_Configuration(void)//定时器2 PWM
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE);  
  /* Configure (PA8、PA9) as input Low-pull */
  /*PA8: TM1_CH1, ExtFan PWM; PA9: TM1_CH2, IntFan PWM; 风扇PWM控制*/
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8|GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource8,  GPIO_AF_2);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,  GPIO_AF_2);
  
       
  TIM_TimeBaseStructure.TIM_Period = 3000-1; //3000
  TIM_TimeBaseStructure.TIM_Prescaler = 2;//2 32M/3000/3=约3.55KHz.
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;//
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//
       
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//
//  TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//
//       
//  TIM_ITConfig(TIM1, TIM_IT_Update , ENABLE);//
//  TIM_Cmd(TIM1, ENABLE);//
       
}

PWM配置:
void TIM1_CHANNEL_Configuration(void)
{
  
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
       
  TIM_TimeBaseStructure.TIM_Period = 3000-1; //3000
  TIM_TimeBaseStructure.TIM_Prescaler = 2;//2 32M/3000/3=约3.55KHz.
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;//
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//
       
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//
  
        TIM_OCInitTypeDef TIM_OCInitStructure; //
/**********************************************************/
          /* PWM1 Mode configuration: Channel4 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为无效电平;否则为有效电平
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //比较输出有效电平选择,Low
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);       
  /******************************  ******************************/
  /* PWM1 Mode configuration: Channel5 */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // 向上计数时,TIMx_CNT<TIMx_CCR1时,输出为无效电平;否则为有效电平
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //比较输出有效电平选择,   
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val; //
  TIM_OC2Init(TIM1, &TIM_OCInitStructure);
  
  TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能        高级定时器TIM1 TIM8需要配置

  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能         
  TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能         
  
  TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
  
  TIM_Cmd(TIM1, ENABLE);

}
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2021-6-30 14:47:00 | 显示全部楼层
确定反了.把它极性反一下不就好了吗?
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2021-6-30 14:55:38 | 显示全部楼层
瞅了瞅,配置应该没太大问题.但应该是忽略了几个硬件特性.
定时器的CNT=0,跟CNT=ARR,就是0点跟周期点,是两个比较特殊的位置的,部分芯片需要这两个点来触发电平反转,当然STM32我记得是可以使用,可以正常反转.
第二个就是硬件IO口翻转要时间的,如果他只有一个定时器计数的时间,有可能硬件都没来得及翻转,所以极限点请慎重
回复

使用道具 举报

5

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
418
金钱
418
注册时间
2020-8-25
在线时间
76 小时
 楼主| 发表于 2021-6-30 14:56:01 | 显示全部楼层
聚东风 发表于 2021-6-30 14:47
确定反了.把它极性反一下不就好了吗?

上头要我查到底哪边出了问题,刚刚发现设置TIM_OC1Init和TIM_OC2Init 初始化参数,但是调试发现,使能的值写到3和4通道上去了,确认没写错函数呀
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2021-7-1 01:13:04 | 显示全部楼层
Monsteri 发表于 2021-6-30 14:56
上头要我查到底哪边出了问题,刚刚发现设置TIM_OC1Init和TIM_OC2Init 初始化参数,但是调试发现,使能的 ...

看寄存器值最直观
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-26 07:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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