请教大神一个视频编码器catv888问题

后使用快捷导航没有帐号?
来自ValentinRuhry的创意,这哥们用整整500
求会写光电编码器程序的大神!
求大神帮忙!请问用光电编码器测量角度的51单片机程序怎么写啊?我在做2007年电子竞赛的F题,就是跷跷板的那题,可是当我用光电编码器的时候,遇到了很大的麻烦,希望各位大神帮帮忙啊,迫切寻求答案。谢谢啦!
这个就不能使用位移传感器吗
广电编码器有ABZ三路脉冲,AB相相差90度,要用到51单片机的脉冲计数功能,才能实现角度技术,512线或者1024线的编码器,每一个脉冲角度 360/512& &或者360/1024线数越高,精度越高。利用51的中断和计数,问题不大。
王栋春 发表于
这个就不能使用位移传感器吗
可是实验室只提供的光电传感器,
郭杜良 发表于
广电编码器有ABZ三路脉冲,AB相相差90度,要用到51单片机的脉冲计数功能,才能实现角度技术,512线或者1024 ...
万分感谢,可是写起程序还是无从下手啊,哥,你能给我一个C语言的事例程序吗?谢谢啦!
Copyright &
Powered by下载作业帮安装包
扫二维码下载作业帮
1.75亿学生的选择
旋转编码器原理问题我拆开了一个编码器,其中1/3为连续触片,剩下2/3为两个有断点触片,但是怎么看这两个断点触片都是一模一样的啊,但是这样的话在通电并旋转的时候形成不了波形的相位差的啊,换句话说就是一个触点在A触片的断点的时候另一个触点也应该在B的断点处,这样两个触片的触点是同步的,怎么形成A,B波形的相位差呢?跪求大神啊。。。。主要还是对旋转方向判断的机制不懂…
动触点的铜片是全相通的 ,相差120度, 静触点片,看图分三部分,分别接外接引脚,这样动触点每个位置就对应了三个引脚间不同的通断关系。其中一个接高电平,另两个就产生不同的时序。
为您推荐:
扫描下载二维码21ic官方微信-->
后使用快捷导航没有帐号?
查看: 6939|回复: 10
stm32f103与编码器接口问题,具体实现,求大神
&&已结帖(20)
主题帖子积分
资深技术员, 积分 318, 距离下一级还需 182 积分
资深技术员, 积分 318, 距离下一级还需 182 积分
主题帖子积分
专家等级:结帖率:68%
主题帖子积分
资深技术员, 积分 318, 距离下一级还需 182 积分
资深技术员, 积分 318, 距离下一级还需 182 积分
有没有人知道下面这些模式的具体功能呢?
TIM_EncoderMode_TI1& && && &TIM编码模式1
TIM_EncoderMode_TI1& && && &TIM编码模式2
TIM_EncoderMode_TI12& && & TIM编码模式3
Datasheet上关于 STM32 正交编码器接口的节选
**********************************************************************
可编程的计数率
x4: 标准模式,所有边沿有效
& &1000线的正交编码器每转产生4000个计数脉冲
x2: 只对A (或B)计数,但仍可确定方向
“转速模式”:正交编码器输入可分频
**********************************************************************
上面这几种模式都怎么设置啊?
还有这句话:
TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
两个TIM_ICPolarity_Rising都代表什么呢?
我就是我,颜色不一样的烟火!
主题帖子积分
资深技术员, 积分 318, 距离下一级还需 182 积分
资深技术员, 积分 318, 距离下一级还需 182 积分
主题帖子积分
专家等级:结帖率:68%
主题帖子积分
资深技术员, 积分 318, 距离下一级还需 182 积分
资深技术员, 积分 318, 距离下一级还需 182 积分
我想问问,具体的实现方式,例如,怎么计算出速度和正反转
我就是我,颜色不一样的烟火!
主题帖子积分
中级工程师, 积分 4834, 距离下一级还需 166 积分
中级工程师, 积分 4834, 距离下一级还需 166 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 4834, 距离下一级还需 166 积分
中级工程师, 积分 4834, 距离下一级还需 166 积分
正反转可以通过A,B脉冲相位关系谁在前判断出,速度嘛,你搜下有好多方法的,如MT法
need to study
主题帖子积分
资深技术员, 积分 318, 距离下一级还需 182 积分
资深技术员, 积分 318, 距离下一级还需 182 积分
主题帖子积分
专家等级:结帖率:68%
主题帖子积分
资深技术员, 积分 318, 距离下一级还需 182 积分
资深技术员, 积分 318, 距离下一级还需 182 积分
/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
* File Name& && && & : stm32f10x_encoder.c
* Author& && && && & : IMS Systems Lab&&
* Date First Issued&&: 21/11/07
* Description& && &&&: This file contains the software implementation for the
*& && && && && && && & encoder unit
********************************************************************************
* History:
* 21/11/07 v1.0
********************************************************************************
* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include &stm32f10x_lib.h&
#include &stm32f10x_encoder.h&
#include &led.h&
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define ENCODER_TIMER& &TIM3&&// Encoder unit connected to TIM3
#define ENCODER_PPR& && && &&&(u16)(360)& &// number of pulses per revolution
#define SPEED_BUFFER_SIZE 8
#define COUNTER_RESET& &(u16)0
#define ICx_FILTER& && &(u8) 6 // 6&-& 670nsec
#define TIMx_PRE_EMPTION_PRIORITY 1
#define TIMx_SUB_PRIORITY 0
#define SPEED_SAMPLING_FREQ (u16)(2000/(SPEED_SAMPLING_TIME+1))
/* Private functions ---------------------------------------------------------*/
s16 ENC_Calc_Rot_Speed(void);
/* Private variables ---------------------------------------------------------*/
s16 hPrevious_angle, hSpeed_Buffer[SPEED_BUFFER_SIZE], hRot_S
u8 bSpeed_Buffer_Index = 0;
volatile u16
hEncoder_Timer_O
bool bIs_First_Measurement = TRUE;
& && &u16 hV
/*******************************************************************************
* Function Name&&: ENC_Init
* Description& & : General Purpose Timer x set-up for encoder speed/position
*& && && && && && &sensors
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
void ENC_Init(void)
&&TIM_TimeBaseInitTypeDef&&TIM_TimeBaseS
&&TIM_ICInitTypeDef TIM_ICInitS
/* Encoder unit connected to TIM3, 4X mode */& &
&&GPIO_InitTypeDef GPIO_InitS
&&NVIC_InitTypeDef NVIC_InitS
&&/* TIM3 clock source enable */
&&RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
&&/* Enable GPIOA, clock */
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
&&GPIO_StructInit(&GPIO_InitStructure);
&&/* Configure PA.06,07 as encoder input */
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
&&GPIO_Init(GPIOA, &GPIO_InitStructure);
&&/* Enable the TIM3 Update Interrupt */
&&NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQC
&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;
&&NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;
&&NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
&&NVIC_Init(&NVIC_InitStructure);
&&/* Timer configuration in Encoder mode */
&&TIM_DeInit(ENCODER_TIMER);
&&TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
&&TIM_TimeBaseStructure.TIM_Prescaler = 0x0;&&// No prescaling
&&TIM_TimeBaseStructure.TIM_Period = (4*ENCODER_PPR)-1;&&
&&TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;& & & & & & & & //tck_tim
&&TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;& &
&&TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);
&&TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI12,
& && && && && && && && && &&&TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
&&TIM_ICStructInit(&TIM_ICInitStructure);
&&TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;
&&TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);
// Clear all pending interrupts
&&TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
&&TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);
&&//Reset counter
&&TIM2-&CNT = COUNTER_RESET;
&&ENC_Clear_Speed_Buffer();
&&TIM_Cmd(ENCODER_TIMER, ENABLE);&&
/*******************************************************************************
* Function Name&&: ENC_Get_Electrical_Angle
* Description& & : Returns the absolute electrical Rotor angle
* Input& && && & : None
* Output& && && &: None
* Return& && && &: Rotor electrical angle: 0 -& 0 degrees,
*& && && && && && && && && && && && && && &S16_MAX-& 180 degrees,
*& && && && && && && && && && && && && && &S16_MIN-& -180 degrees& && && && && && &
*******************************************************************************/
s16 ENC_Get_Electrical_Angle(void)
&&temp = (s32)(TIM_GetCounter(ENCODER_TIMER)) * (s32)(U32_MAX / (4*ENCODER_PPR));
&&return((s16)(temp/65536)); // s16 result
/*******************************************************************************
* Function Name&&: ENC_Clear_Speed_Buffer
* Description& & : Clear speed buffer used for average speed calculation&&
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
void ENC_Clear_Speed_Buffer(void)
&&for (i=0;i&SPEED_BUFFER_SIZE;i++)
& & hSpeed_Buffer[i] = 0;
&&bIs_First_Measurement = TRUE;
/*******************************************************************************
* Function Name&&: ENC_Calc_Rot_Speed
* Description& & : Compute return latest speed measurement
* Input& && && & : None
* Output& && && &: s16
* Return& && && &: Return the speed in 0.1 Hz resolution.& && && && && && &&&
*******************************************************************************/
s16 ENC_Calc_Rot_Speed(void)
&&s32 wDelta_
&&u16 hEnc_Timer_Overflow_sample_one, hEnc_Timer_Overflow_sample_
&&u16 hCurrent_angle_sample_one, hCurrent_angle_sample_
&&if (!bIs_First_Measurement)& & & & & & & & & & & && &//bIs_First_Measurement=TURE
& & // 1st reading of overflow counter& &
& & hEnc_Timer_Overflow_sample_one = hEncoder_Timer_O
& & // 1st reading of encoder timer counter
& & hCurrent_angle_sample_one = ENCODER_TIMER-&CNT;
& & // 2nd reading of overflow counter
& & hEnc_Timer_Overflow_sample_two = hEncoder_Timer_O&&
& & // 2nd reading of encoder timer counter
& & hCurrent_angle_sample_two = ENCODER_TIMER-&CNT;& && &
& & // Reset hEncoder_Timer_Overflow and read the counter value for the next
& & // measurement
& & hEncoder_Timer_Overflow = 0;
& & haux = ENCODER_TIMER-&CNT;& &
& & if (hEncoder_Timer_Overflow != 0)
& && &haux = ENCODER_TIMER-&CNT;
& && &hEncoder_Timer_Overflow = 0;& && && && &
& & if (hEnc_Timer_Overflow_sample_one != hEnc_Timer_Overflow_sample_two)
& & { //Compare sample 1 & 2 and check if an overflow has been generated right
& && &//after the reading of encoder timer. If yes, copy sample 2 result in
& && &//sample 1 for next process
& && &hCurrent_angle_sample_one = hCurrent_angle_sample_
& && &hEnc_Timer_Overflow_sample_one = hEnc_Timer_Overflow_sample_
& &/*判断正反转*/
& & if ( (ENCODER_TIMER-&CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down)&&
& & {// encoder timer down-counting& & & && &反
& && &wDelta_angle = (s32)(hCurrent_angle_sample_one - hPrevious_angle -
& && && && && && &&&(hEnc_Timer_Overflow_sample_one) * (4*ENCODER_PPR));
& & else&&
& & {//encoder timer up-counting& & & &&&正
& && &wDelta_angle = (s32)(hCurrent_angle_sample_one - hPrevious_angle +
& && && && && && &&&(hEnc_Timer_Overflow_sample_one) * (4*ENCODER_PPR));
& & // speed computation as delta angle * 1/(speed sempling time)
& & temp = (signed long long)(wDelta_angle * SPEED_SAMPLING_FREQ);
& & temp *= 10;&&// 0.1 Hz resolution
& & temp /= (4*ENCODER_PPR);
&&} //is first measurement, discard it
& & bIs_First_Measurement = FALSE;
& & temp = 0;
& & hEncoder_Timer_Overflow = 0;
& & haux = ENCODER_TIMER-&CNT;& && &
& & // Check if Encoder_Timer_Overflow is still zero. In case an overflow IT
& & // occured it resets overflow counter and wPWM_Counter_Angular_Velocity
& & if (hEncoder_Timer_Overflow != 0)
& && &haux = ENCODER_TIMER-&CNT;
& && &hEncoder_Timer_Overflow = 0;& && && && &
&&hPrevious_angle =&&
&&return((s16) temp);
/*******************************************************************************
* Function Name&&: ENC_Calc_Average_Speed
* Description& & : Compute smoothed motor speed based on last SPEED_BUFFER_SIZE
& && && && && && & informations and store it variable&&
* Input& && && & : None
* Output& && && &: s16
* Return& && && &: Return rotor speed in 0.1 Hz resolution. This routine
& && && && && && & will return the average mechanical speed of the motor.
*******************************************************************************/
void ENC_Calc_Average_Speed(void)
&&wtemp = ENC_Calc_Rot_Speed();
/* Compute the average of the read speeds */&&
&&hSpeed_Buffer[bSpeed_Buffer_Index] = (s16)
&&bSpeed_Buffer_Index++;
&&if (bSpeed_Buffer_Index == SPEED_BUFFER_SIZE) & & & & & & & &&&//8次平均
& & bSpeed_Buffer_Index = 0;
&&wtemp=0;
&&for (i=0;i&SPEED_BUFFER_SIZE;i++)
& & wtemp += hSpeed_Buffer[i];
&&wtemp /= SPEED_BUFFER_SIZE;
&&hRot_Speed = ((s16)(wtemp));
/*******************************************************************************
* Function Name&&: TIM3_IRQHandler
* Description& & : This function handles TIMx Update interrupt request.
& && && && && && & Encoder unit connected to TIM2
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
void TIM3_IRQHandler(void)
&&/* Clear the interrupt pending flag */
&&TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
&&if (hEncoder_Timer_Overflow != U16_MAX)&&
& &hEncoder_Timer_Overflow++;
ST给的程序,中间有一些别人写进去的程序,它的计算平均速度ENC_Calc_Average_Speed()这个函数我不是很懂,什么意思。什么思想。
我就是我,颜色不一样的烟火!
主题帖子积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
提示: 作者被禁止或删除 内容自动屏蔽
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级工程师, 积分 4834, 距离下一级还需 166 积分
中级工程师, 积分 4834, 距离下一级还需 166 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 4834, 距离下一级还需 166 积分
中级工程师, 积分 4834, 距离下一级还需 166 积分
取8次ROT_Speed
放进BUFFER数组,求平均值,也就相当于给速度均值滤波
need to study
主题帖子积分
资深技术员, 积分 318, 距离下一级还需 182 积分
资深技术员, 积分 318, 距离下一级还需 182 积分
主题帖子积分
专家等级:结帖率:68%
主题帖子积分
资深技术员, 积分 318, 距离下一级还需 182 积分
资深技术员, 积分 318, 距离下一级还需 182 积分
我就是不清楚,把计数器里面的值转换的过程。能跟我讲讲吗?
再者有个疑问,用STM32的编码器接口函数,它的计数是由编码器的脉冲触发的,那么我怎么才知道我的计数频率到底是多少,这就是我不知道速度怎么算出来的缘由。
我就是我,颜色不一样的烟火!
主题帖子积分
资深技术员, 积分 318, 距离下一级还需 182 积分
资深技术员, 积分 318, 距离下一级还需 182 积分
主题帖子积分
专家等级:结帖率:68%
主题帖子积分
资深技术员, 积分 318, 距离下一级还需 182 积分
资深技术员, 积分 318, 距离下一级还需 182 积分
我实际是这个函数不懂,上面发错了。ENC_Calc_Rot_Speed(void)
求平均应该不是你说的相当于滤波吧?
我就是我,颜色不一样的烟火!
主题帖子积分
资深技术员, 积分 318, 距离下一级还需 182 积分
资深技术员, 积分 318, 距离下一级还需 182 积分
主题帖子积分
专家等级:结帖率:68%
主题帖子积分
资深技术员, 积分 318, 距离下一级还需 182 积分
资深技术员, 积分 318, 距离下一级还需 182 积分
s16 ENC_Calc_Rot_Speed(void)里面的计算速度的算法什么意思?
顺便问下这段程序里面两次捕获的时间是怎么确定的?
temp = (signed long long)(wDelta_angle * SPEED_SAMPLING_FREQ);
& & temp *= 10;&&// 0.1 Hz resolution
& & temp /= (4*ENCODER_PPR);
#define SPEED_SAMPLING_FREQ (u16)(2000/(SPEED_SAMPLING_TIME+1))
#define SPEED_SAMPLING_TIME&&9
为什么速度采样频率是一定的?
我就是我,颜色不一样的烟火!
主题帖子积分
中级工程师, 积分 4834, 距离下一级还需 166 积分
中级工程师, 积分 4834, 距离下一级还需 166 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 4834, 距离下一级还需 166 积分
中级工程师, 积分 4834, 距离下一级还需 166 积分
一般你的系统设计时,电机速度要求会给定,你以最大速度情况去采样这时肯定满足,DEMO只是适合他自己的电机的,所以这些东西还需要你改
need to study
主题帖子积分
初级工程师, 积分 2046, 距离下一级还需 954 积分
初级工程师, 积分 2046, 距离下一级还需 954 积分
主题帖子积分
专家等级:结帖率:84%
主题帖子积分
初级工程师, 积分 2046, 距离下一级还需 954 积分
初级工程师, 积分 2046, 距离下一级还需 954 积分
TIM2-&CNT = COUNTER_RESET;
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
涓涓之细流
发帖类勋章
时间类勋章
技术高手奖章
人才类勋章
突出贡献奖章
等级类勋章
沉静之湖泊
发帖类勋章
技术奇才奖章
人才类勋章
时间类勋章
社区建设奖章
等级类勋章ae渲染格式的问题&br/&同一台电脑安装了AE最新版CC和CS 5两个版本,CS 5在渲染输出时可以选择H.264这个格式,可是为什么CC为什么没有这个格式?图1为CC,图2为CS 5。同一台电脑呢,所以应该不是编码器的问题吧?求大神指教,谢谢。
var sogou_ad_id=731545;
var sogou_ad_height=90;
var sogou_ad_width=980;

我要回帖

更多关于 编码器信号一分二 的文章

 

随机推荐