|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
- d( E3 P3 p4 P7 n4 }8 C
8 p+ E. v1 J: p+ n2 D4 y& l' yvoid TIM3_Int_Init(u16 arr,u16 psc)
5 m( B9 r. s2 o5 a{
5 s8 \# |: |7 h3 V2 M TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;0 u4 Y( P& H9 {: _
NVIC_InitTypeDef NVIC_InitStructure;: ]* C! g6 Z2 {
9 a% t& B( J( E, L7 S8 |2 w
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
% [& H9 p( k) g ^5 r% R& |) D- W # d9 _0 t- |. B' p- A
//定时器TIM3初始化 o7 G4 s' t0 D. s4 f0 ]. D
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 ! Z) H; d+ [0 H) t5 f
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
2 q. y" r# y/ x# M! K" ` TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim5 J0 H C0 ^4 K8 T' `+ J
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
: v; `9 x- ?/ T# q# z TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
: o0 v5 c+ ]1 I. R3 \( e// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
4 w& o& A. V. v9 W# h TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
( w' H* ~; [1 M0 [+ h5 {9 O! H9 J: x3 W, _* Y, D& w
//中断优先级NVIC设置
' K- K m' _% L1 u- T NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
9 h! x- d6 V2 F1 v9 k0 t, t NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级" J6 L3 c# A( z: j6 n) y a
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级- R( m7 w( N. U4 ~% Z3 f
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
- M' U8 m5 B/ d' A3 n NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器* T& r" k4 {" D
1 `8 M7 @5 X% E6 y //TIM3_Encoder_Write(65416) ;
& o* j1 d; z; G& r8 Q$ k K4 @ , K/ n) B2 G, s4 z6 s" c
TIM_Cmd(TIM3, ENABLE); //使能TIMx
) g& t0 O, b& Y}. {; _2 L2 c/ e% L# J" y( E
; `. r8 s" v. G9 b# @! h; F$ G- [/ Y7 m, u3 ], Z6 l9 o
0 i4 x# H6 |* {5 w$ ?/**********TIM2_Encoder******/
% A4 a- U( |5 F( G
. J; g2 t4 \# S) o% ]3 [void TIM2_Encoder_Init(u16 arr,u16 psc)# O3 r. [: X; e* }# h/ b
{& `1 [. K9 j; b3 Z$ {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;$ Y p. B- f" w! k8 ~8 R( @3 [$ d! l
NVIC_InitTypeDef NVIC_InitStructure;3 F% ^9 } O+ I0 x1 I
TIM_ICInitTypeDef TIM_ICInitStructure;
1 o$ m2 s! U& X2 ^
! e, }5 ?6 I( {! T RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能/ l- U0 b6 d' I; m# x
, I! Y7 d1 Y7 q //定时器TIM2初始化, n' M' L! b# _1 c, Q$ B6 [, y/ v
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
* j& Z" ^; P! P7 I) C' h TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
: l. w- `: x+ q5 [ TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
: c) Q* I6 D4 }! x _ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
( l0 I$ J$ ~5 a& e D4 r9 h# M# L$ t$ { TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位1 B/ G. E. z' ~2 |. f+ I h
//TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值
- F0 Q4 N3 m1 z4 k
2 g' z) j9 S) P" [: }/ k TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,% {$ Z! ^+ P8 A& j) D
TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);. `0 g, J6 M8 L0 M& b( t& _
TIM_ICStructInit(&TIM_ICInitStructure);
9 M8 K% u: m7 {! j TIM_ICInitStructure.TIM_ICFilter = 6;+ h2 w: M/ |; u; x# L. p7 l
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
5 x; M' `8 g! M/ ]) B f& V) R TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 y5 H' w! j6 t: a
TIM_ICInit(TIM2, &TIM_ICInitStructure);
6 w% V& W4 u. H4 u0 w! z' e //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式% P6 d/ F/ k5 |* s/ a0 \
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
5 U' E4 S0 G" Z& ~+ a$ U' H2 ? TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断# u$ g6 T! [; Y1 \" b& ] T
//TIM2->CNT = 120;" h: M. w ~6 y3 n; v
//中断优先级NVIC设置
4 H/ l6 q; H) s( i. ]( E NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断& ~9 ~ v* _$ x
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
7 x, B$ O( l2 h# f) k NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级: A v0 X+ L# `0 ?- }
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能3 C. \+ `7 d4 @1 f, W7 r- I
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
: L' y7 ?% j0 S/ a0 }) i" N @: ?* P3 a% F+ \
//TIM3_Encoder_Write(65416) ;
, m8 s' T K- R7 @4 m 2 V7 {& x# R% s& J8 n
TIM_Cmd(TIM2, ENABLE); //使能TIMx 4 y) _8 q+ [' q5 `$ b+ b
}
. g; Q* x4 h7 I, F% `7 o- H3 n
0 d# m; u9 [3 N# ?* r% ~& K
0 p8 `3 F, t' {: r: m7 h( l//定时器3中断服务程序
/ H4 U1 Z9 ?1 @, j- mvoid TIM3_IRQHandler(void) //TIM3中断/ |$ d9 A- I3 t8 ?
{
7 `4 D3 \' m8 N* G) ~* V if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否6 Q o3 D. J7 ?
{( M6 C: Z9 H( E7 Q
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
# U+ H; U2 ? W+ C2 \ TIM2->SMCR ^= 0x8000 ;
0 V/ {3 C8 Z; _& T$ x5 c7 Z" {
. b: e2 o& @& z! z EncVal = TIM_GetCounter(TIM2);
0 F, a- v' y( {( W P
* v9 i3 n6 k n' B$ c( v if(EncVal>=240)
* P* B3 @$ h/ c( n {
! c2 R) b& J1 c; i+ a EncVal = 240; 5 A1 S& W9 t" O
}
. T2 \) {' T {9 } LCD_DrawPoint(i, 5+EncVal);
. o$ ]0 M) f- X) s* u- u/ s if(i==320)
7 U) {1 N% t) o {
) D* K: w. ^$ z) m) [4 j i =0;& A$ n) |. A- s8 m; U
LCD_Clear(WHITE); # x4 y0 f! i! s9 M! e0 M K/ o. c
coordinate() ; //横坐标 3 _6 p0 m5 U4 [: X
6 ?7 U* ?2 N+ F( a. F0 @3 [ //delay_ms(50); # Z5 t( ^. A- X& Q% H
}
~( s* B: [6 T; D; P9 O- M i++ ;
7 L5 ]7 u# g$ O8 [$ i6 n TIM2->CNT = 240;
. S G8 ]; z! ^7 p5 N& u Frequent() ;
& [9 N( V/ |" E3 Q, l //fre = 1000/(90 /(720*100/72)) ;
7 _2 K( `( L' F% |, c" T d8 i //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。2 G+ j9 e3 }- s
//sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
% q6 W9 p7 D& |! u, A //LCD_ShowString(200,200,200,16,16,"EncVal");
- b Q( b4 h# A# @ LCD_ShowxNum(250,200,EncVal,5,16,0);
; m7 v% y6 Q. }" n; M, P+ H printf("%d\r\n",EncVal) ;
9 D. L+ K" B& h; i% O TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
1 O+ g: H3 W2 W: K7 I }
! T8 e3 j: z" z4 @' k& i9 C}
2 h. i# ~, M; c6 b
1 G* e( ^1 r0 T2 s |
|