OpenEdv-开源电子网

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

c8t6用TIM2的CH3,CH4输出PWM时,初始化TIM2出错,初始化TIM3则正常输出PWM

[复制链接]

1

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-5-24
在线时间
11 小时
发表于 2019-6-30 00:23:45 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 中华有为 于 2019-7-2 10:24 编辑
  1. <p>#include "l298n_control.h"

  2. //L298N初始化 PA4--IN1, PA5--IN2, PA6--IN3, PA7--IN4, PA2--ENA, PA3--ENB,
  3. void L298N_Init(u16 period, u16 prescaler)
  4. {
  5. GPIO_InitTypeDef GPIO_InitStructure;
  6. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  7. TIM_OCInitTypeDef TIM_OCInitStructure;
  8. </p><p>//使能时钟
  9. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
  10. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  11. //PA4,PA5,PA6,PA7为推挽输出,L,R电机正反转控制引脚
  12. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; //L:IN1,IN2  R:IN3,IN4
  13. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
  14. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15. GPIO_Init(GPIOA, &GPIO_InitStructure);
  16. GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);

  17. //PA0,PA1,PA2,PA3为复用推挽输出,PWM输出引脚
  18. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //ENA,ENB
  19. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出
  20. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  21. GPIO_Init(GPIOA, &GPIO_InitStructure);

  22. //初始化TIM2
  23. TIM_TimeBaseStructure.TIM_Period = period;      //设置自动装载周期值
  24. TIM_TimeBaseStructure.TIM_Prescaler = prescaler;    //设置预分频值
  25. TIM_TimeBaseStructure.TIM_ClockDivision = 0;     //设置时钟分割
  26. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数
  27. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);     //初始化

  28. //初始化TIM2 CH3-CH4 PWM模式
  29. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;    //选择PWM2
  30. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  31. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //极性高
  32. TIM_OC3Init(TIM2, &TIM_OCInitStructure);      //初始化CH3
  33. TIM_OC4Init(TIM2, &TIM_OCInitStructure);      //初始化CH4

  34. TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能CH3预装载寄存器
  35. TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能CH4预装载寄存器

  36. TIM_Cmd(TIM2, ENABLE); //使能TIM2
  37. }</p>
复制代码
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);改为TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);则能输出PWM,这个是哪里出错了呢,望大神斧正。


最佳答案

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

这是我自己使用的代码,在项目中是TIM2 CH2,我在使用是没问题的,你试试。CH3,4原理上是一样的。 如果不行的话应该就是其他地方的问题,例如GPIO或其他问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2019-6-30 00:23:46 | 显示全部楼层
本帖最后由 brucewoo 于 2019-7-2 10:46 编辑
  1.         RCC->APB1ENR |= RCC_APB1Periph_TIM2;                                       //开启定时器时钟
  2.         TIM_TimeBaseStructure.TIM_Period=(1000-1);        
  3.         TIM_TimeBaseStructure.TIM_Prescaler= (72-1);               
  4.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               
  5.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;               
  6.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  7.         TIM_ARRPreloadConfig(TIM2, DISABLE);                                           //使能ARR预装载缓冲器
  8.         //TIM2时基初始化完成
复制代码
  1.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                 //PWM模式
  2.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;       // 输出使能
  3.     TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;        // 反向通道无效
  4.     TIM_OCInitStructure.TIM_Pulse = 0; //初始暂时为0
  5.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;            
  6.     TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;     
  7.     TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  8.     TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;  
  9.     TIM_OC2Init(TIM2,&TIM_OCInitStructure);                           
  10.     TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
  11.     TIM_Cmd(TIM2, ENABLE);
复制代码
这是我自己使用的代码,在项目中是TIM2 CH2,我在使用是没问题的,你试试。CH3,4原理上是一样的。
如果不行的话应该就是其他地方的问题,例如GPIO或其他问题。
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-5-24
在线时间
11 小时
 楼主| 发表于 2019-7-1 16:50:43 | 显示全部楼层
顶下!求帮助
回复

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2019-7-2 08:21:32 | 显示全部楼层
既然发上来求助,为何不检讨一下发出来的代码是否好看好读呢?
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-5-24
在线时间
11 小时
 楼主| 发表于 2019-7-2 10:00:45 | 显示全部楼层
brucewoo 发表于 2019-7-2 08:21
既然发上来求助,为何不检讨一下发出来的代码是否好看好读呢?

好的,实在抱歉
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-5-24
在线时间
11 小时
 楼主| 发表于 2019-7-2 17:28:47 | 显示全部楼层
brucewoo 发表于 2019-7-2 10:39
这是我自己使用的代码,在项目中是TIM2 CH2,我在使用是没问题的,你试试。CH3,4原理上是一样的。
如果 ...

我用你的代码也试了试,还是初始化TIM3才有效。我现在一头雾水,我再试试其他的。谢谢
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-5-24
在线时间
11 小时
 楼主| 发表于 2019-7-3 00:04:06 | 显示全部楼层
brucewoo 发表于 2019-7-2 10:39
这是我自己使用的代码,在项目中是TIM2 CH2,我在使用是没问题的,你试试。CH3,4原理上是一样的。
如果 ...

我设置CNT和CCR寄存器的数值出问题了,我太二了,给你添麻烦了。
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-5-24
在线时间
11 小时
 楼主| 发表于 2019-7-3 00:06:07 | 显示全部楼层
我设置CNT和CCR寄存器出现问题了,给你添麻烦了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 07:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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