中级会员
 
- 积分
- 328
- 金钱
- 328
- 注册时间
- 2018-8-2
- 在线时间
- 170 小时
|
50金钱
现在我先不求速度,因为目前用2000线的编码器接stm32f407zgt6的芯片的编码器接口。目前是编码器转动很少角度,得出的脉冲数确实接近最大值的脉冲数,我想问一下各位大神是否有类似情况,我应该如何避免,还是我的程序设置有错,麻烦大家了
- void TIM3_Encode_init(u16 arr,u16 psc)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- // NVIC_InitTypeDef NVIC_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_ICInitTypeDef TIM_ICInitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
-
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3); //GPIOA6复用为定时器3通道1
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_TIM3); //GPIOA7复用为定时器3通道2
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //GPIOA6和GPIOA7
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用模式
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //浮空
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA6和PA7
-
- TIM_TimeBaseStructure.TIM_Period = arr; //(编码器线数-1)*4 四倍频原理
- TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
- TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
- TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分频因子,不分频
- TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //初始化TIM3
-
- TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising );//编码器配置(定时器、编码模式、上升沿、上升沿)
-
- TIM_ICInitStructure.TIM_Channel=TIM_Channel_1; //选择输入端IC1映射到TI1上
- TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising; //上升沿捕获
- TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI; //映射到TI1上
- TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; //配置输入分频,不分频
- TIM_ICInitStructure.TIM_ICFilter =0xF; //配置输入滤波器
- TIM_ICInit(TIM3,&TIM_ICInitStructure);
- //
- // TIM_ICInitStructure.TIM_Channel=TIM_Channel_2; //选择输入端IC2映射到TI2上
- // TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising; //上升沿捕获
- // TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI; //映射到TI2上
- // TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; //配置输入分频,不分频
- // TIM_ICInitStructure.TIM_ICFilter=0xF; //配置输入滤波器
- // TIM_ICInit(TIM3,&TIM_ICInitStructure);
-
-
-
- // NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断分组配置
- // NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能
- // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
- // NVIC_InitStructure.NVIC_IRQChannelSubPriority =0x02; //响应优先级2
- // NVIC_Init(&NVIC_InitStructure); //配置定时器3
- //
- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断
- TIM_SetCounter(TIM3,0);
- TIM_Cmd(TIM3,ENABLE); //使能定时器3
- }
- /*单位时间编码器计数 输入定时器 输出速度值*/
- int Read_Encoder(u8 TIMX)
- {
- int Encoder_TIM;
- switch(TIMX)
- {
- case 2: Encoder_TIM= (short)TIM2 -> CNT; TIM2 -> CNT=0;break;
- case 3: Encoder_TIM= (short)TIM3 -> CNT; TIM3 -> CNT=0;break;
- case 4: Encoder_TIM= (short)TIM4 -> CNT; TIM4 -> CNT=0;break;
- default: Encoder_TIM=0;
- }
- return Encoder_TIM;
- }
复制代码- int main(void)
- {
- unsigned int k;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置系统中断优先级分组2
- delay_init(168); //初始化延时函数
- uart_init(115200); //初始化串口波特率为115200
- LED_Init(); //初始化LED
- KEY_Init(); //初始化按键
- TIM3_Encode_init((ENCODER_PPR-1)*4,1); //编码器初始化
- while(1)
- {
- k=Read_Encoder(3);
- printf("k:%d\r\n",k);
- delay_ms(5);
- }
- }
复制代码
|
最佳答案
查看完整内容[请看2#楼]
找到原因了,NPN的增量式编码器必须加上拉电阻,不然的话就会导致电平不稳定,现在测速基本稳定,误差也不大.A、B、Z相三相接上拉电阻就可以实现
|