找回密码
 注册
关于网站域名变更的通知
查看: 44|回复: 0
打印 上一主题 下一主题

STM32的编码器接口介绍

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2023-2-27 17:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
1、硬件接口
$ X0 E" F) R% P
7 S/ `0 w0 g+ j编码器AB接在定时器的CH1CH2Z信号则接在任意管脚有信号来进行中断清零计数。2、软件部分      在数据手册里说了一句,编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。       主函数部分+ @5 `4 i+ h6 H
7 h1 ^, _* E, N1 s+ S/ E7 n
int main(void)
6 h: Z5 D* z$ r( U% z  l- ]{                       2 Y2 \6 u& O  L& J9 o
        delay_init();                     //延时函数初始化       , U3 ]) _) A! ~9 q1 n" P1 ?' S" H9 e  ?/ O8 B, F3 Z+ N% Q( @9 [" q9 O
        delay_ms(7000);% A  u  r) X  a8 S3 }5 j: n
        GpioConfig_Init();8 Y6 s  ^5 p; i0 z3 z9 O) L
( e, N  g# a$ ]" V$ H; B; S# T        GPIO_SetBits(GPIOC,GPIO_Pin_9);        //RESET置位为1$ Q# b. j* ?7 n) l0 f7 `$ Q) }
       7 {8 H( q" k7 J' k' J0 w( R
        TIM1_PWM_Init(1000,71);         //设置多久进一次中断/ M  u, Y) e. w
4 q8 X2 Z! k; W: \1 }3 s        TIM3_PWM_Init(65535,9);         ( ^8 ?) v- O3 r; }- p2 E
        TIM4_PWM_Init(/*65535*/4000,0);
( x8 g$ c8 f3 _( j/ A) i& v* V1 H7 M5 t( R
+ g* k7 P$ Z; t! J9 A4 S2 O# N1 I- n5 \' |: e
        GPIO_SetBits(GPIOB,GPIO_Pin_5);       " j5 c( v+ l& g( B( |. e  `' Z+ R4 {# C2 I/ S. C; Q& m
        GPIO_SetBits(GPIOB,GPIO_Pin_6);5 }% L6 F8 C0 L6 c9 n
5 ~' `7 u7 n' T% t5 J) }" N        GPIO_ResetBits(GPIOB,GPIO_Pin_7);       , p9 n8 j, c- ?' p/ u7 B0 U
* {" i$ C9 F( I5 o      
/ ]) l# |) P" t4 L4 q7 N6 ~( D! b        while(1)7 e1 s! z( R) W2 i: q
3 k8 g/ ^: S) `+ E' n0 X7 N        {                                                                         4 {4 u- z" @+ z1 ?# a% N: j5 O
1 c/ L0 M0 ~2 F                if(tim1cont ==500)" u) g5 @. V# [$ _3 R$ b: ^
                {5 Z+ j8 i$ S9 i8 A
                        tim1cont=0;! I' C7 t* l3 n! ?: j
% w# @. [* y) f                        if(CCR2_Val>80)+ X- x: Z: n* e" A8 s1 p) r/ \! ]) Y! {, V% }
                        {       . I: V6 R# x& o+ W# e' t( k7 m( t# j! H1 \7 n. L  H  k! _1 s
                        CCR2_Val--;
% i  J7 h4 a& w! N7 e9 y# g                        }- M* v9 m  Q$ Q' x% v
  t; Y- z: u2 L( R  l' g: l) q  Z0 U                        else8 q# d) w/ ]( Z7 T5 S
                        CCR2_Val=80        ;8 K2 ?) |' |; E* V# [7 |, W
                               % r$ ?, O5 w# U% P' Q
* j9 q0 C% p6 l/ @) f4 G6 O        EncCnt = (OveRFlowCount * 4000 + TIM_GetCounter(TIM4));        //实际计数值                       
/ F0 O/ Q2 r% e2 {/ v' z' t# o                        Time_Flag &= ~SAMPLING;+ ~0 {0 O% m/ l; `! k
                }) Y4 ?+ A2 ^9 o0 p+ a
        }2 h) H* j! D* n1 g4 A: Z
; R. N& t( @4 [4 w. ~$ K4 r  w  g}2 k) C  o8 h: n: n, G) L+ l6 m/ n  z2 l( O+ ?5 @: |
//我们使用的定时器4,OverflowCount这个值是哪里来的呢?是中断函数进入的次数,我们在初始化的时候设置4000个脉冲就进入中断一次.乘以次数加上TIM_GetCounter(TIM4)就是总共的脉冲个数。) n4 z: t! o1 [" s& Z. j% ]( e' `0 O: T
: ]! B3 `! v! J1 @* F5 X
- q9 d! E* g6 P! o9 _! l' n" |0 L7 v8 ]# r, P! w/ P( [3 D1 S( k
/ D4 y! [8 i4 r! g1 A# z/ c% F/ o) g# C/ D; v: |7 i
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; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值       计数到5000500ms计数值,最大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++; } }}

* r+ Z. [( ^9 u! ^
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-19 11:53 , Processed in 0.125000 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表