|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
# H/ `$ Q6 s$ ?8 _ C' u. \" {
void TIM3_Int_Init(u16 arr,u16 psc)" o- G$ K$ V* d. C4 A1 g* q2 y' M
{
* }. ?* X" O! N& T- S4 R- O# L TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
P" J' s- h) R& f) p6 g) f NVIC_InitTypeDef NVIC_InitStructure;
1 D6 C7 v6 y* e- }, S) k* b# w
& M) k- l+ G+ N$ K RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
: R% m6 {; K. Y# L" b
4 e2 n' Y* [- b; D7 x //定时器TIM3初始化: d$ @! {6 |# @& i" q
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
) B q' O4 o. s$ k6 e! a* Y+ Z TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值, G C! t" ]' j+ J2 V7 {6 [
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim4 R# x" ~, d' L& |. O& Q( o
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
/ m8 s9 @" X$ q6 Y% y/ o TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
* Q% X1 y; j& |0 g// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式! F6 f- K" _ ?: ]
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断% o, x6 s1 t8 y$ ]9 Q% q, J
. a7 V9 |1 D( Y' F8 a //中断优先级NVIC设置
/ o8 K3 R" R# @+ O( z$ O NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
. Q$ {9 f3 Z0 l3 N, w/ M' ] NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级( N% {! b! w$ j- b* q6 D% I$ B
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级" W* G! v0 I! {
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
' w# Q( E; n A& n. O NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
, M4 E, W( |! n4 a* O2 n9 }0 @4 S. Y
//TIM3_Encoder_Write(65416) ;
! ?2 `5 _( {$ Y; n & U2 H/ j; R. p$ ]
TIM_Cmd(TIM3, ENABLE); //使能TIMx
8 g3 c- T+ N; A' M}
, J, V! v- c( f& {2 }. o
/ k" s7 V* g/ l' v ~3 M0 k' v7 x5 y
7 F) @/ N/ f9 n+ Q {" M- U; ?; _' a1 O% j' b& M7 [
/**********TIM2_Encoder******/, r4 g( O: a, p; Q
2 f' F! ~4 @' Z8 H
void TIM2_Encoder_Init(u16 arr,u16 psc)
G8 \9 f1 ?4 A1 B- G" h" t{' A* o9 q7 h+ Y5 m/ w: a4 T
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
8 n' M% B- _' ^( V/ | NVIC_InitTypeDef NVIC_InitStructure;
9 v7 Z' T2 W' f: h TIM_ICInitTypeDef TIM_ICInitStructure;
3 ]3 n$ U$ S% {2 s7 e3 o" K5 U) {0 B W( v' `/ ~2 E! D! U1 @& H! x
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
" z( }, m( s) n P2 w 2 [' P: v3 P# R M' \$ u c
//定时器TIM2初始化6 Y P, X6 @5 F5 ?; m& {
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 ( Z% T6 @5 G5 e/ G* k% w) Z% {
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
& c0 t1 k" ]: M TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
1 y2 a$ V1 F+ C$ p3 c3 B" k TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
9 S* J# l0 c5 G% o' V TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位' u+ W( D: i2 s+ J5 H9 P0 h
//TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值
5 v+ ]! }3 B. ~% ~# Q/ \9 u
! {: g% B; v. W TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,: T, b4 Z/ L0 F" `. w0 [' W
TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
" F3 ?/ x# F8 i TIM_ICStructInit(&TIM_ICInitStructure);% G, y! M: }& `& b' Q% \( i1 E
TIM_ICInitStructure.TIM_ICFilter = 6;6 |. S! }/ U7 W1 {
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
6 @. a' N3 [8 G1 L w7 |' P TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
% F2 W, S( O+ `( k+ Q$ S TIM_ICInit(TIM2, &TIM_ICInitStructure);
. k* a% Y, U- P: u) R0 T2 ?" _) t //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
: F& Q J% R- J: @0 B+ c4 p+ q- ^ TIM_ClearFlag(TIM2, TIM_FLAG_Update);
% ]3 N3 E+ x. w7 C# H- F1 g2 P/ s TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
. l6 t& J6 h/ A //TIM2->CNT = 120;. M: s) K8 ]/ V( I
//中断优先级NVIC设置. @1 G/ v3 m$ [9 ]9 t
NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断
* n. i7 I- d' m* Z NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
& c: b8 h6 Q/ g$ A8 ^: e! n- K NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级0 z- D+ |3 H7 O+ y
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能! |7 V. \6 A |& e, c, U( F2 o" x
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
3 I7 N) F% r! J( ~# X( B: k8 }) L: z" ~+ ]& J c
//TIM3_Encoder_Write(65416) ;- V- D3 j m9 U9 y
, p% Y7 T# L5 h6 e s
TIM_Cmd(TIM2, ENABLE); //使能TIMx
! U8 N. H l) |3 x. `9 b}8 ~6 ?9 W5 h4 `9 h7 D
5 y3 t! K4 C; m
+ x& q, G* T/ n- t7 {3 m/ U//定时器3中断服务程序1 h2 b+ N0 g% ^0 M
void TIM3_IRQHandler(void) //TIM3中断
- Y3 }; `( m' ~; ~* v9 `+ z. v: d{
* B4 r" O1 F" s* ? n) K* W$ { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否' @* C6 h8 d" o( C( B0 f
{
& s! q* V: ]6 L9 t+ e# y% m# i8 _ TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 " Z+ k; H5 O& m8 L6 X/ U
TIM2->SMCR ^= 0x8000 ;4 O+ ^) Z! A! ^. D0 ~) M! K
/ \' \7 q' B) }, n
EncVal = TIM_GetCounter(TIM2);- h. r, R& W' {' y
8 Q1 a$ u" U1 V4 {$ `6 Y if(EncVal>=240)
; l/ I! l1 U: @+ p7 h' h" M {
5 d. h- Y, |5 q EncVal = 240; % T; P) {# C! k: Y5 k. r% P
}1 I. r- W! n6 _$ r
LCD_DrawPoint(i, 5+EncVal);
( [# C7 J; p3 b7 | if(i==320)
8 a2 l1 k) P, T7 Z" W. x1 I/ V4 I% u { , m# m4 l" F2 d8 {
i =0;
. V. F; Y" ?: F0 V2 H% |% { LCD_Clear(WHITE); $ B' w( h8 L. k
coordinate() ; //横坐标
( U3 q; Q; J4 ~6 M1 V $ s% x5 Y4 m9 r% O" ?7 @1 x: v& w
//delay_ms(50); 2 N3 b$ T& P8 I/ j; F2 m
}; }( N1 ^1 N5 [1 h' S" G8 Z F
i++ ; 1 w( s6 n, h/ T/ E
TIM2->CNT = 240;
( ~+ l4 }3 B* t Frequent() ;
# f5 p9 Y. ]5 j" X //fre = 1000/(90 /(720*100/72)) ; % p6 M* R e: Y
//sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。; X3 S+ T% L' O" E& D/ H
//sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
/ c, w# l! A4 @3 k //LCD_ShowString(200,200,200,16,16,"EncVal");
2 Q7 ?8 G7 r' ]- a6 \0 a7 L7 E LCD_ShowxNum(250,200,EncVal,5,16,0);* Q' ?4 y3 L9 J! C. @
printf("%d\r\n",EncVal) ;
. s7 A0 s5 O4 V2 R9 @& R TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
- W1 P6 J$ U- p/ M8 B! Y; [ }
5 V2 Y, y. U n* G5 Z}, q6 R7 ~, {6 l
! g5 @; z( l S# ]3 e' L* K |
|