网站建设吉金手指专业13,中小企业如何建设网站,校园网站建设促进教学,区块链网站用vue.js做怎么样前言 雨打灯难灭#xff0c;风吹色更明。 若飞天上去#xff0c;定作月边星。——李白《咏萤火》 一、旋转编码器介绍
旋转编码器是一种可以左右旋转#xff0c;同时也可以按下#xff0c;也可以按下旋转的器件#xff0c;通过左右旋转对应着内部不同开关的导通#xff…前言 雨打灯难灭风吹色更明。 若飞天上去定作月边星。——李白《咏萤火》 一、旋转编码器介绍
旋转编码器是一种可以左右旋转同时也可以按下也可以按下旋转的器件通过左右旋转对应着内部不同开关的导通同时按下也可以旋转由此看来旋转编码器可以实现很复杂的功能简单的通过左右旋转可以调节音量、亮暗等功能按键可以发挥普通按键的作用按下按键的同时左右旋转又可以区别普通旋转的按键因此可以用一个旋转编码器同时调节音量和亮暗(举例),同时也可以通过不同的转速实现不同的功能综上所述它的功能很复杂用处也很多。 旋转编码器是用来测量转速并配合 PWM 技术可以实现快速调速的装置光电式旋转编码器通过光电转换可将输出轴的角位移、角速度等机械量转换成相应的电脉冲以数字量输出REP。 按信号的输出类型分为 电压输出、集电极开路输出、推拉互补输出和长线驱动输出。形式分类 有轴型有轴型又可分为夹紧法兰型、同步法兰型和伺服安装型等。 轴套型轴套型又可分为半空型、全空型和大口径型等。 以编码器工作原理可分为 光电式、磁电式和触点电刷式。 按码盘的刻孔方式不同分类编码器可分为增量式和绝对式两类。 旋转编码器的原理和特点 原理 旋转编码器是集光机电技术于一体的速度位移传感器。当旋转编码器轴带动光栅盘旋转时经发光元件发出的光被光栅盘狭缝切割成断续光线并被接收元件接收产生初始信号。该信号经后继电路处理后输出脉冲或代码信号。旋转编码器是由一个中心有轴的光电码盘组成其上有环形通、暗的刻线有光电发射和接收器件读取获得四组正弦波信号组合成A、B、C、D,每个正弦波相差90度相位差将C、D信号反向叠加在A、B两相上可以增强稳定信号;另每转输出一个Z相脉冲以代表零位参考位。因为A、B两相相差90度可以通过比较A相在前还是B相在前借此来判别编码器的正转与反转通过零位脉冲可获得编码器的零位参考位。 特点 体积小、重量轻、品种多、功能全、频响高、分辨能力高力矩小耗能低性能稳定可靠使用寿命长等特点。
1、增量式编码器 增量式编码器是将位移转换成周期性的电信号再把这个电信号转变成计数脉冲用脉冲的个数表示位移的大小。增量式编码器也称为正交编码器是通过两个信号线的脉冲输出来进行数据处理一个输出脉冲就对应于一个增量位移编码器每转动一定的位移就会产生一个脉冲信号。通过读取单位时间脉冲信号的数量达到测量速度的效果v s / t通过对脉冲信号的累加和编码器的码盘周长 转一圈对应的距离 便可以达到计算距离的效果s n * d。 工作原理 增量式旋转编码器通过两个光敏接收管来转化角度码盘的时序和相位关系得到角度码盘角度位移量的增加正方向或减少负方向。 上图A、B两点间的距离为S2A、B表示两个相同的光敏接收管下面的角度码盘的光栅间距分别为S0凹槽和S1凸起。当角度码盘匀速转动时可知输出波形图中的S0S1S2比值与实际图的S0S1S2比值相同同理当角度码盘变速转动时输出波形图中的S0S1S2比值与实际图的S0S1S2比值仍相同。通过输出波形图可知每个运动周期
顺时针运动逆时针运动A BA B1 11 10 11 00 00 01 00 1 我们把当前的A、B输出值保存起来与下一个到来的A、B输出值做比较就可以得出角度码盘转动的方向 如果光栅格S0等于S1时也就是S0和S1弧度夹角相同且S2等于S0的1/2那么可得到此次角度码盘运动位移角度为S0弧度夹角的1/2再除以所用的时间就得到此次角度码盘运动位移的角速度。 S0等于S1时且S2等于S0的1/2时1/4个运动周期就可以得到运动方向位和位移角度如果S0不等于S1S2不等于S0的1/2那么要1个运动周期才可以得到运动方向位和位移角度了。 我们用的鼠标的滚轮也是这个原理。 实际使用的增量式编码器输出三组方波脉冲A、B和Z有的叫C相相。A、B两组脉冲相位差90º可以判断出旋转方向和旋转速度。而Z相脉冲又叫做零位脉冲有时也叫索引脉冲为每转一周输出一个脉冲Z相脉冲代表零位参考位通过零位脉冲可获得编码器的零位参考位专门用于基准点定位如下图所示 增量是编码器转轴旋转时有相应的脉冲输出其计数起点可以任意设定可实现多圈无限累加和测量。编码器轴转动一圈会输出固定的脉冲数脉冲数由编码器码盘上面的光栅的线数所决定编码器以每旋转360度提供多少通或暗的刻线称为分辨率也称解析分度、或称作多少线一般在每转5~10000线当需要提高分辩率时可利用90度相位差的A、B两路信号进行倍频或者更换高分辩率编码器。 增量型编码器精度取决于机械和电气的因素这些因素有光栅分度误差、光盘偏心、轴承偏心、电子读数装置引入的误差以及光学部分的不精确性误差存在于任何编码器中。 编码器的信号输出有正弦波电流或电压、方波TTL、HTL等多种形式。并且都可以用差分驱动方式含有对称的A/A-、B/B-、Z/Z-三相信号由于带有对称负信号的连接电流对于电缆贡献的电磁场为0信号稳定衰减最小抗干扰最佳可传输较远的距离例如对于TTL的带有对称负信号输出的编码器信号传输距离可达150米。对于HTL的带有对称负信号输出的编码器信号传输距离可达300米。 增量式编码器轴旋转时有相应的相位输出。其旋转方向的判别和脉冲数量的增减需借助后部的判向电路和计数器来实现。其计数起点可任意设定并可实现多圈的无限累加和测量。还可以把每转发出一个脉冲的Z信号作为参考机械零位。当脉冲已固定而需要提高分辨率时可利用带90度相位差AB的两路信号对原脉冲数进行倍频。 编码器时序 实物图
我使用的是下面这种比较简单的五脚旋转编码器 二、引脚配置
我使用的旋转编码器有五个引脚可能还会有其他不同类型的会有不同的引脚 这五个引脚分别为GND, VCC, SW, DT, CLK具体的引脚已经在简介的图中标明了。
VCC接电源正极 3.3~5VGND接地SWSwitch开关PA7(TIM3_CH2)DTDT数据PA6(TIM3_CH1)CLKCLK时钟PA5任选一个引脚配置为上拉输入模式
接线表
旋转编码器的接口STM32的IO口设置的工作模式VCCVCC(3.3V)-GNDGND-SWSwitch开关PA7定时器编码模式DTDT数据PA6定时器编码模式CLKCLK时钟PA5GPIO_Mode_IPU上拉输入模式-PA9TXUSART1 串口1通信-PA10RXUSART1 串口1通信 三、新建工程
1.打开STM32CubeMX软件点击“新建工程” 2. 选择 MCU 和封装 3.配置时钟 具体学习可以参考博客网站-RCC学习
4.配置调试模式 5.串口USART1配置 6.定时器TIM配置
配置为编码器模式
7.生成代码
输入项目名称和路径。注路径中不允许出现中文。 选择应用的IDE开发环境MDK-ARM V5 每个外设生成独立的 ’.c/.h’ 文件
不勾 所有初始化代码都生成在 main.c勾选 初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。 点击 GENERATE CODE 生成代码
8.构建工程
DeBug的模式根据不同的芯片进行选择 四、编写代码
在main.c文件中添加一下代码
重写fget和fput函数勾选微库这个很重要添加头文件stdio.h
/* USER CODE BEGIN Includes */
#includestdio.h
/* USER CODE END Includes *//*** 函数功能: 重定向c库函数printf到DEBUG_USARTx* 输入参数: 无* 返 回 值: 无* 说 明无*/
int fputc(int ch, FILE *f)
{HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 0xffff);return ch;
}/*** 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx* 输入参数: 无* 返 回 值: 无* 说 明无*/
int fgetc(FILE *f)
{uint8_t ch 0;HAL_UART_Receive(huart1, ch, 1, 0xffff);return ch;
}
添加代码encoder文件对.c/.h: 首先要新建文件然后在添加到工程中去 将新建的文件添加到工程中去 返回上一级寻找自己新建的文件 - 此时完成了添加encoder.c文件 在encoder.c中添加如下代码即可将encoder.h添加进工程
#include encoder.h在encoder.c中添加代码
#include encoder.huint8_t lock; //旋钮锁死标志1表示锁死
uint16_t count; //计数标志uint8_t ENCODER_READ(void)
{uint8_t key 0; //存放按键的值uint8_t level; //记录按钮另一端的电平值if(HAL_GPIO_ReadPin(encoder_port_A, encoder_right) HAL_GPIO_ReadPin(encoder_port_A, encoder_left)) //读取此时{lock 0; //判断旋钮是否锁死}if(!HAL_GPIO_ReadPin(encoder_port_A, encoder_right) lock 0) //判断是否旋转按钮同时判断是否有按钮锁死{HAL_Delay(100);level HAL_GPIO_ReadPin(encoder_port_A,encoder_left); //把旋钮另一端电平状态记录HAL_Delay(13); //延时if(!HAL_GPIO_ReadPin(encoder_port_A, encoder_right)) //去抖{if(level 0){key 1; //右转}else{key 2; //左转}count 0; //初始锁死判断计数器while(!HAL_GPIO_ReadPin(encoder_port_A, encoder_right) count 60000) //等待放开旋钮同时累加判断锁死{count;lock 1;HAL_Delay(200);}}}if(!HAL_GPIO_ReadPin(encoder_port_A,encoder_down) lock 0){HAL_Delay(20);if(!HAL_GPIO_ReadPin(encoder_port_A,encoder_down)) //消抖{key3;}}return key;
}在encoder.h中添加代码
#ifndef _ENCODER_H_
#define _ENCODER_H_#include main.h
#include tim.h#define encoder_port_A GPIOA#define encoder_left GPIO_PIN_6 //定义IO接口DT 旋钮左转
#define encoder_right GPIO_PIN_5 //定义IO接口CLK旋钮右转
#define encoder_down GPIO_PIN_7 //定义IO接口SW 旋钮按下uint8_t ENCODER_READ(void); //接口读取值#endif
在主函数main.c中添加代码
/*** brief The application entry point.* retval int*/
int main(void)
{/* USER CODE BEGIN 1 */int b;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM3_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */printf(encoder is ready\r\n);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */b ENCODER_READ(); //读出旋转器编码器值HAL_Delay(1000); if(b1){printf(编码器右转\r\n);}if(b2){printf(编码器左转\r\n);}if(b3){printf(编码器按下\r\n);}}/* USER CODE END 3 */
} 五、实验结果 谢谢阅读