OpenEdv-开源电子网

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

求助 为啥我用定时器的比较模式频率改变不了 改自动重装载值频率不变

[复制链接]

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2017-8-17
在线时间
23 小时
发表于 2017-9-21 10:33:14 | 显示全部楼层 |阅读模式
我这边想用stm32的定时器3控制步进电机驱动器发送脉冲。用输出比较模式能输出脉冲。但是发现改变重装载值频率不变。不知道什么问题希望大家回答下。谢谢了。
工程文件我发布在下面了。大家可以看看。
#include "sys.h"
#include "timer.h"
#include "led.h"
void timer3_PWM_init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        //Step1. PB.1口设置为TIM3的OC4输出口
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        //Step3.使能TIM3的输出比较匹配中断
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        TIM_TimeBaseStructure.TIM_Prescaler = 71;                                                    //分频系数为71  得到真正的时基单元为72M/(71+1)=1M
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                    //向上计数
        TIM_TimeBaseStructure.TIM_Period = 0xffff;                                                        //自装载值为65535  特殊值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

        /* Channel 4 Configuration in oc mode */
        TIM_OCStructInit(&TIM_OCInitStructure);
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;                                     //触发事件   电平翻转
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                 //开启输出
        TIM_OCInitStructure.TIM_Pulse = 10000;                                                         //10000
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                     //输出极性
       
        TIM_OC4Init(TIM3,&TIM_OCInitStructure);                                                     //通道4
        TIM_ClearFlag(TIM3, TIM_FLAG_CC1|TIM_FLAG_CC2|TIM_FLAG_CC3|TIM_FLAG_CC4);//清中断标志位
        TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);//TIM3中断源设置,开启相应通道的捕捉比较中断

        TIM_Cmd(TIM3, ENABLE);
       
    //TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能定时器2的通道1预装载寄存器
}

void TIM3_IRQHandler(void)
{
     int capture;
         u16 led0pwmval=0;
         u8 dir=1;
     if(TIM_GetITStatus(TIM3,TIM_IT_CC4) == SET)
     {
                 if(dir)led0pwmval++;
                 else led0pwmval--;
                 if(led0pwmval>3000)dir=0;
                 if(led0pwmval==0)dir=1;       
         TIM_ClearITPendingBit(TIM3, TIM_IT_CC4 );
         capture = TIM_GetCapture1(TIM3);
         TIM_SetCompare4(TIM3, capture + led0pwmval);

     }
}


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

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2017-9-21 14:06:18 | 显示全部楼层
你这个中断中的变量需要用 static 修饰
回复 支持 反对

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2017-8-17
在线时间
23 小时
 楼主| 发表于 2017-9-21 15:58:40 | 显示全部楼层
wxjhby 发表于 2017-9-21 14:06
你这个中断中的变量需要用 static 修饰

capture这个?我没在别的地方调用这个变量呀
回复 支持 反对

使用道具 举报

14

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-7-27
在线时间
73 小时
发表于 2017-9-21 16:05:58 | 显示全部楼层
你的u16 led0pwmval=0; u8 dir=1没有加static ,则每次进来都是一样的初始值,所以你的设置的值永远都不会变化
回复 支持 反对

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2017-8-17
在线时间
23 小时
 楼主| 发表于 2017-9-21 17:08:17 | 显示全部楼层
诸葛亮的哥哥 发表于 2017-9-21 16:05
你的u16 led0pwmval=0; u8 dir=1没有加static ,则每次进来都是一样的初始值,所以你的设置的值永远都不会 ...

我现在加了 还是没用 频率改变不了。步进电机还是一样的速度。
回复 支持 反对

使用道具 举报

19

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2017-9-21
在线时间
171 小时
发表于 2017-9-21 17:14:53 | 显示全部楼层
stm32sport 发表于 2017-9-21 17:08
我现在加了 还是没用 频率改变不了。步进电机还是一样的速度。

错误:capture = TIM_GetCapture1(TIM3);一个获取通道1, TIM_SetCompare4(TIM3, capture + led0pwmval);一个设置通道4?
回复 支持 反对

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2017-8-17
在线时间
23 小时
 楼主| 发表于 2017-9-21 17:36:48 | 显示全部楼层
哆啦A萌 发表于 2017-9-21 17:14
错误:capture = TIM_GetCapture1(TIM3);一个获取通道1, TIM_SetCompare4(TIM3, capture + led0pwmval); ...

咦?    我看看。
回复 支持 反对

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2017-8-17
在线时间
23 小时
 楼主| 发表于 2017-9-21 22:54:29 | 显示全部楼层
谢谢了。折腾了好久的问题原来是那个提取当前CNT函数搞错了通道。已经可以正常输出脉冲了。再次谢谢。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 01:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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