|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1、硬件接口
7 w7 ]! k0 x4 \1 ?* @/ z, }. n1 C6 D9 d6 M! E) X
编码器AB接在定时器的CH1、CH2上Z信号则接在任意管脚有信号来进行中断清零计数。2、软件部分 在数据手册里说了一句,编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。 主函数部分+ @5 `4 i+ h6 H N+ a8 T: A( N$ U7 U( b
int main(void)- E9 z" d1 ^9 ^7 b" d4 S, C4 a
{
! G+ L7 t" B7 d/ ?* `7 u9 z) q0 g delay_init(); //延时函数初始化 , U3 ]) _) A! ~9 q1 n" P1 ?' S" H9 e/ Q3 u& n& z8 t# j! {5 \
delay_ms(7000);2 ~9 R5 l8 E; E
GpioConfig_Init();8 Y6 s ^5 p; i0 z3 z9 O) L* K; P" _4 V& M9 A, e1 n
GPIO_SetBits(GPIOC,GPIO_Pin_9); //RESET置位为1
0 {$ O4 y2 `' y+ k6 }* S
" u% a! z9 H, a3 C TIM1_PWM_Init(1000,71); //设置多久进一次中断/ M u, Y) e. w, H/ Y' D' o& V7 W( O, f& F/ i
TIM3_PWM_Init(65535,9);
. Q5 K2 |- K; P* P TIM4_PWM_Init(/*65535*/4000,0);; v8 Y c7 h0 |$ S
& v* V1 H7 M5 t( R
0 L) [: ?5 o7 s+ _/ i5 I
+ i0 a, n0 L, E6 \# I) o* b GPIO_SetBits(GPIOB,GPIO_Pin_5); " j5 c( v+ l& g( B( |. e
) F! j) z* F6 ~" u) c: H! l6 j# u GPIO_SetBits(GPIOB,GPIO_Pin_6);5 }% L6 F8 C0 L6 c9 n1 @1 `2 g* U4 V: j$ w; p. O/ Y
GPIO_ResetBits(GPIOB,GPIO_Pin_7); , p9 n8 j, c- ?' p/ u7 B0 U4 H( }8 A* m4 s* x F
9 ]& P$ D4 f$ a) d E while(1)7 e1 s! z( R) W2 i: q
% Y9 ^5 U& M& y { 4 {4 u- z" @+ z1 ?# a% N: j5 O7 O: X4 z) a1 s; g# D- ~7 F6 w
if(tim1cont ==500)
c. \) F" y1 b {0 a9 u9 T8 z: D7 F5 g/ {( p
tim1cont=0;! I' C7 t* l3 n! ?: j
4 u; q% p8 F8 c/ \4 _9 \, @ if(CCR2_Val>80)+ X- x: Z: n* e" A8 s1 p, }3 z" [4 F0 |' s
{ . I: V6 R# x& o+ W# e' t( k7 m( t# j2 }8 q0 k7 O& \/ Y2 v+ K, M/ Z
CCR2_Val--;
, \9 ?8 C1 w3 k& U# W& ^ }- M* v9 m Q$ Q' x% v- q( a' |- R9 `: j* _
else
1 `- l& X! f7 {3 b/ R1 G# f4 T CCR2_Val=80 ;& l& m1 Y% w1 s% x: {. F
% r$ ?, O5 w# U% P' Q6 @3 b3 w8 f- l s- X
EncCnt = (OveRFlowCount * 4000 + TIM_GetCounter(TIM4)); //实际计数值
, V( C- u7 ]& V1 R% |1 Z Time_Flag &= ~SAMPLING;
: |" {- |# j2 i$ P }
+ t7 M j- w. Z }2 h) H* j! D* n1 g4 A: Z- }$ @$ Z8 \- V% l
}2 k) C o8 h: n: n, G) L+ l
% L, i( a' d5 a- h4 Q4 x//我们使用的定时器4,OverflowCount这个值是哪里来的呢?是中断函数进入的次数,我们在初始化的时候设置4000个脉冲就进入中断一次.乘以次数加上TIM_GetCounter(TIM4)就是总共的脉冲个数。) n4 z: t! o1 [" s) r) @8 c) f3 T6 W' r+ g
: ]! B3 `! v! J1 @* F5 X1 I0 X, ~+ D: m6 y8 `5 {
! l' n" |0 L7 v8 ]# r, P! w) z- R- s9 C8 V
/ D4 y! [8 i4 r! g1 A# z/ c% F
T2 ?) ]% A) A! V8 u. y5 Y) ~voidTIM4_PWM_Init(u16 arr,u16 psc){ GPIO_InitTypeDef GPIO_InitStructure; //声明GPIO结构体变量 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//TIM_OCInitTypeDef TIM_OCInitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_ICInitTypeDef TIM_ICInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO,ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关闭JTAG RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器3时钟 GPIO_PinRemapConfig(GPIO_Remap_TIM4,ENABLE);//定时器管脚重映射 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 |GPIO_Pin_13| GPIO_Pin_14; //TIM_CH2 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化GPIO //TIM_DeInit(TIM4); TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms计数值,最大65535 TIM_TimeBaseStructure.TIM_Prescaler =psc;//设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; //设置时钟分割:TDTS =Tck_tim TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //TIM_ITConfig(TIM4,TIM_IT_CC1 ,ENABLE );//使能指定的TIM4中断,允许更新中断 //TIM_ITConfig(TIM4,TIM_IT_CC2 ,ENABLE );//使能指定的TIM4中断,允许更新中断 NVIC_InitStructure.NVIC_IRQChannel =TIM4_IRQn; //TIM4中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_EncoderInterfaceConfig(TIM4,TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);//两路上下边沿都计数 TIM_ICStructInit(&TIM_ICInitStructure);//输入捕获模式配置为硬件默认值TIM_ICInitStructure.TIM_ICFilter= 0;//ICx_FILTER; ?//比较滤波器TIM_ICInit(TIM4,&TIM_ICInitStructure);//调用库函数把配置信息填充进去TIM4->CNT =0; //计数器清零TIM_ClearFlag(TIM4,TIM_FLAG_Update);//清除TIM4的更新标志位 TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//使能中断 TIM_Cmd(TIM4,ENABLE);//使能定时器4} voidTIM4_IRQHandler(void){ //N--;EncCnt++;//= (N* 65536 + TIM4->CNT); if(TIM_GetITStatus(TIM4,TIM_IT_Update)!= RESET){ TIM_ClearITPendingBit(TIM4 ,TIM_FLAG_Update); aQ = TIM4->CR1;//方向 位 if((aQ & 0x0010)== 0x0010)//向下计数 { N--; } else if((aQ & 0x0010) == 0x0000)//向上计数 {N++; } }}
9 {/ d$ r3 L/ h/ n7 w' ?& e6 U |
|