|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
4 Z- h3 v. c7 c& n; L1 o( y! e \0 }! H
void TIM3_Int_Init(u16 arr,u16 psc)2 L5 A4 T' r' S+ k6 {1 T; D
{
% W5 R7 q, Z( j6 V TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;- ]( G8 ^( m2 Q+ J& L, u6 M
NVIC_InitTypeDef NVIC_InitStructure;; d* E7 Y4 ^1 p: F/ J: j8 {
6 G. d. _, B4 V9 C; H RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
1 p! |4 U; W, V+ D$ @5 M9 N5 u ; s. F& |3 A" Z$ r" R' O7 y k
//定时器TIM3初始化
3 j( [8 f5 x6 ]5 k( J TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
* _* w2 D) \' t" m5 W" ? TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值' z3 j: ^! V. n( ]
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
4 S! R$ L6 j' n$ z& l7 \. ] TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
; C5 z n& {* a9 O; }8 ? TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
6 r; p) Y, W9 o4 S' v1 T// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式$ e, T7 u, c' P( b6 _
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断% B4 p8 e" P& p5 e3 J( C* w
+ J% g; J9 B) ~- k' _7 |8 x //中断优先级NVIC设置9 ]* X Y/ D/ x9 @
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断% k, I: [0 | F s
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级- R! s3 j& j4 k. a, O. R8 s, {
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
1 P( Z: p3 z# c+ y7 F/ H( F6 A1 L0 { NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能! e5 ` z1 m3 }& g" W4 O1 d
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器8 d' T# G' }; N& }$ p5 v
8 ^ H y1 ^3 c2 A/ [8 g8 W8 y0 L
//TIM3_Encoder_Write(65416) ;
0 E5 g0 e* p7 B ) }! }9 Q$ ^4 ?8 t8 n
TIM_Cmd(TIM3, ENABLE); //使能TIMx + y2 n/ Q- g9 Q2 z, O4 M$ y7 V% r
}
; }3 u% V; A* T' T/ t, t) m' j e3 j7 s1 U+ D" ~
* D k2 @/ a0 }3 L
0 m' C: X/ l0 u1 y z
/**********TIM2_Encoder******/& L9 w/ v6 H5 J+ m' z( y6 o
- M" @! @3 [4 r" v' y; K( ]void TIM2_Encoder_Init(u16 arr,u16 psc)
0 x7 l3 K, k& H @) Y7 L{: ~4 e. |# ^1 G) R: @
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;! c) l! }( v/ [5 `* E3 ~* a* b
NVIC_InitTypeDef NVIC_InitStructure;2 k0 w4 ~. t3 i, x
TIM_ICInitTypeDef TIM_ICInitStructure;
4 L P2 \8 x# [6 \ w- q. J1 e v% J) a7 F7 q9 {5 `0 k; N( r
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
: B% J# m" K8 v4 L: N9 j
. x# Y% x$ i( u //定时器TIM2初始化+ b7 G" g1 V. w$ W( l
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
' d3 Z* @9 N c( |; H1 d TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
* S4 D6 N$ M1 J ^% x9 Q TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim) q+ s5 j# V1 I3 o! I r% |8 X
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式) f* z/ l2 r4 |( @6 R; u
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
" w4 Q' p& T1 u5 x3 Y7 g, j //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值$ }# x6 c- }8 L! `1 u
3 ^& f. C w) E* e: B5 D TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,. m; f# w# H& h7 G: X/ t( v
TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);& x$ N, Z9 C' D6 y
TIM_ICStructInit(&TIM_ICInitStructure);
# p/ U# [: W# A H# [8 f1 O TIM_ICInitStructure.TIM_ICFilter = 6;
& i$ l' h9 R4 A% }+ a* b TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
: I" V R% J4 A2 p3 H) @, h1 M TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 4 Z/ C, T% E4 Q/ `0 a: `3 |
TIM_ICInit(TIM2, &TIM_ICInitStructure);
: ~) x7 u, S" {1 A% J/ } //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式: X5 S5 _8 O: V; v6 w0 M
TIM_ClearFlag(TIM2, TIM_FLAG_Update);. @ u. z% G7 `
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断7 b5 i2 L( R: P9 E Z5 l
//TIM2->CNT = 120;
% R1 g8 D! D1 u9 s% E //中断优先级NVIC设置. d; {, U% m' T$ `3 ]
NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断" @8 B* V& u( V, M0 F# x
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
6 _, M4 r" q/ N$ Z- r) `4 I$ @* ? NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
" L; h& ^6 P. w3 v$ y% Z NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能) U% _$ y# a2 J! f7 U2 y' a+ X) {* k" w
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
0 ^- C- n ]3 p- H7 Y0 q, P ~, }- |; D6 ~
//TIM3_Encoder_Write(65416) ;; y) l: g5 I! ]% T- W
; @; @: l" D) O0 K$ D; z TIM_Cmd(TIM2, ENABLE); //使能TIMx
' v* a. L+ i9 S$ o& h; ?- i}
X& f/ S3 D& x/ E7 t5 O+ k! {8 T+ {. e7 F2 A& S
5 f& D6 c3 u" r. C0 c6 z//定时器3中断服务程序
0 ]. w9 ^3 A p/ Qvoid TIM3_IRQHandler(void) //TIM3中断
$ Q( Q1 C$ I/ @" g6 P9 l{
# H2 D/ h/ h. M4 k3 [( i* _0 @* e if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
$ ]/ c4 h+ P- L" w$ J, Q {
3 u% T, ^- H5 t2 S4 B) g6 E R( {1 F TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
( b. b5 K6 i0 R9 l G( x1 ^* R TIM2->SMCR ^= 0x8000 ;" h+ j! f6 g$ F% v
' y6 ?% c: d' Q- D EncVal = TIM_GetCounter(TIM2);3 t2 i) f* O6 v# i5 l- }9 V
' A1 k! _4 ]6 V) l2 R, G6 B if(EncVal>=240)
- S' ^2 f' a: c {' j( P L, {5 a6 L4 r7 N
EncVal = 240;
. d% B+ l- Y: r9 v }
! n1 w6 U" |8 J3 y LCD_DrawPoint(i, 5+EncVal);
% H* L4 m& D8 L+ E2 n. O if(i==320)- V: v3 e8 H& x. o4 y3 J
{ 9 X7 ?; B7 l+ D X) Y# j
i =0;
3 r7 N# t: U6 p* O! K LCD_Clear(WHITE); . d* A1 `1 g, N3 l* W& {
coordinate() ; //横坐标 B$ R4 a% l/ S$ V: x
) }, B5 V" s& k& e( M7 s //delay_ms(50);
6 n; P: P0 O) i, l }
, L5 V, N% C8 a* X, m& A i++ ; * Q2 J) Z6 a# \; Q- C0 i% m
TIM2->CNT = 240; # [1 C2 x3 k, l: G% o% o
Frequent() ;
% E8 k* r7 h* {6 S; { //fre = 1000/(90 /(720*100/72)) ;
+ L& N. N! |% Z3 _& T/ B //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。6 ?" v$ ]8 f* z1 r
//sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
$ a( d$ b0 i; t- G3 k1 ?; { //LCD_ShowString(200,200,200,16,16,"EncVal");: v/ i0 p7 \3 V8 Z1 j. L
LCD_ShowxNum(250,200,EncVal,5,16,0);1 Q3 S$ {8 y- N3 v0 q
printf("%d\r\n",EncVal) ;/ Q: o9 T# y' T8 ]" {4 K! P) G
TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
' ~1 K, |: x! ]/ L3 t }( Z# T& {% u5 I7 F+ y6 T
}
* E) A1 f7 I8 b* G" k# S1 u2 R" B( b+ \( s, c
|
|