搜索
bottom↓
回复: 17

求教:TIM1_CH1输出不了PWM是因为配置问题吗??

[复制链接]

出0入0汤圆

发表于 2017-2-15 18:42:13 | 显示全部楼层 |阅读模式
打算用PA8输出PWM控制液晶的亮度,没发现配置有问题,但PWM输出不了,这是因为什么呢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入42汤圆

发表于 2017-2-15 21:28:21 | 显示全部楼层
LZ在配置初始化结构体TIM_OCInitStructure时没有把所有成员都设为确定的值,这个可能会过不了参数检查
LZ可以单步进TIM_OC1Init去看看

另外,TIM1要注意TIM_TimeBaseStructure的TIM_RepetitionCounter成员,这个数取任何值都能通过参数检查,但会影响定时器的时基。。LZ最好也把它设为0

出0入0汤圆

 楼主| 发表于 2017-2-16 08:44:05 | 显示全部楼层
wshtyr 发表于 2017-2-15 21:28
LZ在配置初始化结构体TIM_OCInitStructure时没有把所有成员都设为确定的值,这个可能会过不了参数检查
LZ可 ...

初始化所有参数还是没有PWM输出

出0入0汤圆

 楼主| 发表于 2017-2-16 08:46:40 | 显示全部楼层
wshtyr 发表于 2017-2-15 21:28
LZ在配置初始化结构体TIM_OCInitStructure时没有把所有成员都设为确定的值,这个可能会过不了参数检查
LZ可 ...

在别的IO上可以输出PWM,这应该跟TIM_OCInitStruture参数部分初始化没问题

出0入0汤圆

发表于 2017-2-16 09:19:33 | 显示全部楼层
用的哪个型号?部分STM若要是使用PWM的话需要烧写Option bytes,比如STM8S003若用PC6为PWM模式的话需要烧AFR0。

出0入0汤圆

发表于 2017-2-16 09:27:17 | 显示全部楼层
什么型号的MCU呢,问题不全面,不利于坛友给你发现问题所在啊。

出0入0汤圆

 楼主| 发表于 2017-2-19 10:46:29 | 显示全部楼层
xf331785508 发表于 2017-2-16 09:27
什么型号的MCU呢,问题不全面,不利于坛友给你发现问题所在啊。

STM32F407VET6

出0入0汤圆

发表于 2017-2-19 11:18:19 | 显示全部楼层
AFIO 时钟开了吗

出0入0汤圆

 楼主| 发表于 2017-2-19 11:30:32 | 显示全部楼层

M4的没有AFIO时钟,直接用IO口的复用功能就行了,我已经复用了

出0入4汤圆

发表于 2017-2-19 12:10:36 来自手机 | 显示全部楼层
在初始化定时器之前,是不是初始化GPIO了? 先初始化定时器,再初始化,其他的就可以了。昨天我也是搞这个搞到了半夜。

出0入0汤圆

 楼主| 发表于 2017-2-19 14:11:29 | 显示全部楼层
xiaoergao 发表于 2017-2-19 12:10
在初始化定时器之前,是不是初始化GPIO了? 先初始化定时器,再初始化,其他的就可以了。昨天我也是搞这个 ...

我的是1.初始化GPIO 2.初始化定时器 3.初始化定时器的PWM,没有发现问题。可以发下你的这部分代码给我吗,谢谢!!

出0入4汤圆

发表于 2017-2-19 14:32:58 | 显示全部楼层
lwj199302 发表于 2017-2-19 14:11
我的是1.初始化GPIO 2.初始化定时器 3.初始化定时器的PWM,没有发现问题。可以发下你的这部分代码给我吗, ...

主程序:
  1.         systemInit();
  2.         uart3.init(2000000);
  3.         MB.init(11,115200);
  4.         pwm0.init(500);
  5.         pwm1.init(500);
  6.         pwm2.init(500);
  7.         pwm3.init(500);
  8.         pwm4.init(500);
  9.         pwm5.init(500);
  10.         pwm6.init(500);
  11.         pwm7.init(500);
  12.         AD.init();
复制代码



PWM初始化
  1.         pTIMER->init();
  2.         pTIMER->setArr(arr-1);
  3.         pTIMER->setPrescale(scale-1);
  4.         pTIMER->enable();
  5.        
  6.         pGPIO->mode(GPIO_Mode_AF_PP);
  7.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  8.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
  9.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  10.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
  11.         pTIMER->setOC(ch, &TIM_OCInitStructure);
  12.         TIM_CtrlPWMOutputs(pTIMER->TIMx, ENABLE);
复制代码


TIMER的初始化
  1. void TIMER::init(){
  2.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  3.        
  4.         if(TIMx == TIM1){
  5.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  6.         }
  7.         if(TIMx == TIM2){
  8.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  9.         }
  10.         if(TIMx == TIM3){
  11.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  12.         }
  13.         if(TIMx == TIM4){
  14.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  15.         }
  16.         if(TIMx == TIM5){
  17.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
  18.         }

  19.          
  20.         TIM_TimeBaseStructure.TIM_Period = 0;  
  21.         TIM_TimeBaseStructure.TIM_Prescaler = 0;  
  22.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  
  23.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  24.         TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);
  25. }
复制代码


我用的C++ 应该也能看明白吧

出0入0汤圆

发表于 2017-2-19 19:50:32 | 显示全部楼层
stm8s003的TIM1_CH1要要烧写配置字,ST32F4没用过,不太清楚

出0入0汤圆

发表于 2017-2-19 22:33:01 来自手机 | 显示全部楼层
注意!timer1为高级定时器。

出0入0汤圆

发表于 2017-2-21 10:20:40 | 显示全部楼层
        // Set timer period
        TIM_TimeBaseInitStruct.TIM_Prescaler         = 6 - 1;  // 48 / 6 = 8MHz
        TIM_TimeBaseInitStruct.TIM_CounterMode       = TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_Period            = 4000- 1;  //2KHz 500us
        TIM_TimeBaseInitStruct.TIM_ClockDivision     = TIM_CKD_DIV1;
        TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_Prescaler 和TIM_Period的赋值,带着公式更清晰。

出0入0汤圆

 楼主| 发表于 2017-2-25 09:08:28 | 显示全部楼层
erlengzi 发表于 2017-2-19 22:33
注意!timer1为高级定时器。

高级定时器不是和通用定时器一样吗,除了加多一句 TIM_CtrlPWMOutputs(TIM1,ENABLE);

出0入0汤圆

 楼主| 发表于 2017-4-12 18:19:02 | 显示全部楼层
修改部分代码,问题解决了,代码修改如下
//初始化TIM1 Channel1 PWM模式         
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
       
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_Pulse = 50;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性低
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 4OC1
        TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);  //使能TIM1在CCR1上的预装载寄存器

出0入17汤圆

发表于 2017-8-29 11:40:14 | 显示全部楼层
高级定时器 就是高级...
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 17:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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