打印
[STM32F1]

关于主从定时器门控模式的问题 ,想求助一下各位

[复制链接]
1725|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我用到了TIM4和TIM2,TIM4输出一个PWM波,TIM2采用门控模式,当TIM4为低电平的时候,TIM2开始对外部脉冲进行计数,高电平时即停止计数。目前我在网上看到的,都是主定时器输出高电平时,从定时器进行计数,就像问一下如何反过来。我的代码是这样的:

//TIM4 PWM部分初始化        ST    PB7输出
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM4_PWM_Init(u16 arr,u16 psc)
{  
        RCC->APB1ENR|=1<<2;         //TIM4时钟使能   
        RCC->APB2ENR|=1<<3;            //使能PORTB时钟        
        GPIOB->CRL&=0X0FFFFFFF;        
        GPIOB->CRL|=0XB0000000;        //PB7输出,复用功能输出                    
           
        TIM4->ARR=arr;                        //设定计数器自动重装值
        TIM4->PSC=psc;                        //预分频器不分频
        
        TIM4->CCMR1|=7<<12;          //CH2 PWM2模式                 
        TIM4->CCMR1|=1<<11;         //CH2预装载使能           
        TIM4->CCER|=1<<4;           //OC2 输出使能           
        TIM4->CR1=0x0080;           //ARPE使能
        TIM4->CR2|=0x5<<4;        //MMS=101
        TIM4->CR1|=0x01;            //使能定时器4
}



void TIM2_Int_Init()
{
        RCC->APB1ENR|=1<<0;         //TIM2时钟使能   
        RCC->APB2ENR|=1<<2;            //使能PORTA时钟        
        
  GPIOA->CRL&=0xfffffff0;        
        GPIOA->CRL|=0x00000008;        //PA0浮空输入模式  
        GPIOA->IDR|=1<<1;       //PA1上拉
        
        TIM2->SMCR&=~(0xf<<8);    //ETF=0000:没有滤波
        TIM2->SMCR&=~(3<<12);     //ETPS=00:不使用预分频器
  TIM2->SMCR|=0<<15;        //ETP=0:外部触发极性,ETR不反相,上升沿有效
        TIM2->SMCR|=1<<14;        //ECE=1:外部时钟使能位,使能外部时钟模式2。计数器由ETRF信号上的任意有效边沿驱动
        TIM2->SMCR|=0x5<<0;       //SMS=101:配置定时器为门控模式
        TIM2->SMCR|=0x3<<4;       //TS=011:内部触发3(ITR3),TIM4  

        TIM2->CNT = 0x0;      //计数器清零
        TIM2->CR1|=0x1;            //使能计数器2
        
}
沙发
香水城| | 2019-1-7 16:10 | 只看该作者
到底是 问什么呢?
TIM4输出PWM信号作为触发信号;
TIM2工作在门控从模式,其时钟源自行选择;可以是内部时钟源,可以是来自外部ETR脚,可以是其它定时器的输出;

使用特权

评论回复
板凳
木九十|  楼主 | 2019-1-7 22:57 | 只看该作者
本帖最后由 木九十 于 2019-1-7 23:03 编辑
香水城 发表于 2019-1-7 16:10
到底是 问什么呢?
TIM4输出PWM信号作为触发信号;
TIM2工作在门控从模式,其时钟源自行选择;可以是内部时 ...

就是我想要让这个门控模式  低电平有效,但现在能够实现的是触发源高电平时TIM2才计数,想问一下如何能够实现触发源低电平有效?我试过置TIMx_CCER寄存器中CC1P=1但好像并不行(这里我用的是定时器主从模式进行内部触发)

使用特权

评论回复
地板
磨砂| | 2019-1-8 08:31 | 只看该作者
我记得有一个寄存器的控制位是用来控制极性的啊

使用特权

评论回复
5
晓伍| | 2019-1-8 09:39 | 只看该作者
我记得是可以的 哪里设置的不对

使用特权

评论回复
6
八层楼| | 2019-1-8 10:27 | 只看该作者
先用单一的一个试试看

使用特权

评论回复
7
香水城| | 2019-1-8 15:10 | 只看该作者
木九十 发表于 2019-1-7 22:57
就是我想要让这个门控模式  低电平有效,但现在能够实现的是触发源高电平时TIM2才计数,想问一下如何能够 ...

哦,可以工作在低电平进行工作的。
TIMX_CCER里的 CC1P=1,CC1NP=0才对

使用特权

评论回复
8
木九十|  楼主 | 2019-1-8 16:29 | 只看该作者
八层楼 发表于 2019-1-8 10:27
先用单一的一个试试看

如果我用外部触发源的方式,置TIM2_CCER寄存器的CC2P位为1,是可以低电平有效的,但我这里我用了主从模式内部触发的方法好像就不行了。QAQ

使用特权

评论回复
9
木九十|  楼主 | 2019-1-8 16:49 | 只看该作者
本帖最后由 木九十 于 2019-1-8 17:10 编辑

我之前是直接将输出TIM4的PWM的PB7口接到PA1口进行外部触发的,后来因为PB7口还要接到别的地方所以才改成内部触发的。
我之前外部触发时的TIM2的门控模式设置是这样的。

但我后来改为内部触发后,发现上面这几个寄存器就不发挥作用了,删了也能运行程序,但是好像只能默认高电平有效。

使用特权

评论回复
10
香水城| | 2019-1-9 17:15 | 只看该作者
木九十 发表于 2019-1-8 16:49
我之前是直接将输出TIM4的PWM的PB7口接到PA1口进行外部触发的,后来因为PB7口还要接到别的地方所以才改成内 ...

哦,你的触发信号来自内部。那是这样的,没法调整极性。
如果触发信号是来自TI1/或TI2是可以做极性选择的的。

使用特权

评论回复
11
木九十|  楼主 | 2019-1-9 17:33 | 只看该作者
香水城 发表于 2019-1-9 17:15
哦,你的触发信号来自内部。那是这样的,没法调整极性。
如果触发信号是来自TI1/或TI2是可以做极性选择的 ...

好的  谢谢

使用特权

评论回复
12
香水城| | 2019-1-10 17:28 | 只看该作者

不过,如果触发信号来自其它定时器的OCREF信号,看看能否修改前面
定时器的PWM输出模式,比方将PWM1改成PWM2,这样间接实现
低电平计数的目的。

当然,前提是不影响其它功能。

使用特权

评论回复
13
木九十|  楼主 | 2019-1-11 16:18 | 只看该作者
香水城 发表于 2019-1-10 17:28
不过,如果触发信号来自其它定时器的OCREF信号,看看能否修改前面
定时器的PWM输出模式,比方将PWM1改成P ...

我的触发信号的确是来自其它定时器的OCREF信号,但这个信号我还要连到其他地方,那我能不能在另一个通道上输出一个互补的信号来作为触发源,原来的那个信号继续用?

使用特权

评论回复
14
香水城| | 2019-1-11 17:05 | 只看该作者
木九十 发表于 2019-1-11 16:18
我的触发信号的确是来自其它定时器的OCREF信号,但这个信号我还要连到其他地方,那我能不能在另一个通道 ...

一般来讲,那互补信号没法做触发输出,具体你参考下相应的参考手册。

使用特权

评论回复
15
木九十|  楼主 | 2019-1-11 17:16 | 只看该作者
香水城 发表于 2019-1-11 17:05
一般来讲,那互补信号没法做触发输出,具体你参考下相应的参考手册。

好的 ,谢谢  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

19

帖子

0

粉丝