打印
[STM32F1]

初学STM32,自己看了下编码器接口,写了个简单的码

[复制链接]
877|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Jokyfjk|  楼主 | 2015-12-14 20:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看到编码器接口模式,自己尝试写了个代码(读出计数器的累积的脉冲数值,通过串口1打印输出),很不完善,但理解了正交编码器,继续整复杂的控制!求大神给指点,勿藐视。

#include "pbdata.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void TIM3_Configuration(void);
void NVIC_Configuration(void);
void USART_Configuration(void);
int fputc(int ch,FILE *f)
{
       USART_SendData(USART1,(u8)ch);
       while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
       return ch;
}
int main(void)
{
      u16 data;
      RCC_Configuration();//系统时钟初始化
      GPIO_Configuration();//端口初始化
      USART_Configuration();//串口配置
      NVIC_Configuration();//优先级配置函数
      TIM3_Configuration();//定时器及编码器设置
      while(1)
         {
              data=TIM_GetCounter(TIM3);
              printf("计数器的值为:data=%d\r\n",data);
              delay_ms(1000);
              delay_ms(1000);
              delay_ms(1000);
         }  
  
}
void RCC_Configuration(void)
{
        SystemInit();//72MHz
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}

void GPIO_Configuration(void)
{
       GPIO_InitTypeDef GPIO_InitStructure;
       //TX
       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
       GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
       GPIO_Init(GPIOA,&GPIO_InitStructure);
       //RX
       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
       GPIO_Init(GPIOA,&GPIO_InitStructure);
       //增量式正交编码器-使用TIM3的CH1和CH2
       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
       GPIO_Init(GPIOA,&GPIO_InitStructure);
}

void TIM3_Configuration(void)
{
       TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
       TIM_ICInitTypeDef TIM_ICInitStructure;

       TIM_TimeBaseStructure.TIM_Period = 0xffff; //初值
       TIM_TimeBaseStructure.TIM_Prescaler = 0x0; //预分频
       TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
       TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上
       TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
       //编码器设置
       TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
       TIM_ICStructInit(&TIM_ICInitStructure);
       TIM_ICInitStructure.TIM_ICFilter = 10;
       TIM_ICInit(TIM3,&TIM_ICInitStructure);
       TIM3->CNT = RESET;
       TIM_Cmd(TIM3,ENABLE);
}

void NVIC_Configuration(void)
{
       NVIC_InitTypeDef NVIC_InitStructure;
       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
       NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;   //抢占优先级
       NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;    //响应优先级
       NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;     //使能
       NVIC_Init(&NVIC_InitStructure);   //初始化

       NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       NVIC_Init(&NVIC_InitStructure);

}
void USART_Configuration(void)
{
       USART_InitTypeDef USART_InitStructure;
       USART_InitStructure.USART_BaudRate=9600; //配置波特率
       USART_InitStructure.USART_WordLength=USART_WordLength_8b;//配置数据位
       USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位
       USART_InitStructure.USART_Parity=USART_Parity_No;//96N81格式无奇偶校验
       USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流控制
       USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//打开接收发射使能
       USART_Init(USART1, &USART_InitStructure);
       USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//打开接收中断,每接收一个产生一次中断
       USART_Cmd(USART1,ENABLE);
       USART_ClearFlag(USART1,USART_FLAG_TC);
}

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

7

帖子

0

粉丝