完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
KY-040旋转编码器模块
工作电压:5V 一圈脉冲数:20 旋转编码器可通过旋转可以计数正方向和反方向转动过程中输出脉冲的次数,旋转计数不像电位计,这种转动计数是没有限制的。配合旋转编码器上的按键,可以复位到初始状态,即从0开始计数。 工作原理:增量编码器是一种将旋转位移转换为一连串数字脉冲信号的旋转式传感器。这些脉冲用来控制角位移。在Eltra编码器中角位移的转换采用了光电扫描原理。读数系统以由交替的透光窗口和不透光窗口构成的径向分度盘(码盘)的旋转为依据,同时被一个红外光源垂直照射,光把码盘的图像投射到接收器表面上。接收器覆盖着一层衍射光栅,它具有和码盘相同的窗口宽度。接收器的工作是感受光盘转动所产生的变化,然后将光变化转换成相应的电变化。再使低电平信号上升到较高电平,并产生没有任何干扰的方形脉冲,这就必须用电子电路来处理。读数系统通常采用差分方式,即将两个波形一样但相位差为180°的不同信号进行比较,以便提高输出信号的质量和稳定性。读数是再两个信号的差别基础上形成的,从而消除了干扰。 增量编码器给出两相方波,它们的相位差90°,通常称为A通道和B通道。其中一个通道给出与转速相关的信息,与此同时,通过两个通道信号进行顺序对比,得到旋转方向的信息。还有一个特殊信号称为Z或零通道,该通道给出编码器的绝对零位,此信号是一个方波与A通道方波的中心线重合。 现在实现检测这个增量编码器正转还是反转 我们这里用读取IO的方式来读取数据,来判断是正转还是反转。 单片机型号:STM32L052K8* 接线:CLK 接 PA0 DT 接 PA1 SW 接 PA2 int main(void) { /* USER CODE BEGIN 1 */ unsigned char dt; unsigned char clk,key; /* 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_USART1_UART_Init(); /* USER CODE BEGIN 2 */ printf(“nr****wantin****nr”); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ printf(“n**************nr”); clk = HAL_GPIO_ReadPin(DT_GPIO_Port,DT_Pin); dt = HAL_GPIO_ReadPin(DT_GPIO_Port,DT_Pin); key = HAL_GPIO_ReadPin(SW_GPIO_Port,SW_Pin); if(1 == clk) { printf(“nclk == 1nr”); } else { printf(“nclk == 0nr”); } if(1 == dt) { printf(“ndt == 1nr”); } else { printf(“ndt == 0nr”); } if(1 == key) { printf(“nkey == 1nr”); } else { printf(“nkey == 0nr”); } HAL_Delay(1000); } /* USER CODE END 3 */ } 实现效果来看,不理想: 不管你正转还是反转,CLK和DT这两个引脚的电平,都是成0、1交替,而且两个的电平一致,根本无法区分正转还是反转。 随后,将其插上电源,用示波器测试了一下这两个引脚产生的波形。效果如下: 采集中断0口,接的clk信号 正转的波形图:黄色的线为clk,蓝色的线为dt 下降沿触发,采集到的电平 都为低电平 clk = 0 dt = 0; 反转的波形图:黄色的线为clk,蓝色的线为dt 下降沿触发,采集到的电平 clk = 0 dt = 1; 通过波形可以看出,正反转是有波形区别的,如何实现正反转检测,可以使用中断的方式来实现。 采用下降沿触发方式来采集波形的变化。 int main(void) { /* USER CODE BEGIN 1 */ unsigned char dt; unsigned char clk,key; /* 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_USART1_UART_Init(); /* USER CODE BEGIN 2 */ printf(“nr****wantin****nr”); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ printf(“n**************nr”); if(10 == spped_counter) { printf(“n***正转***nr”); } else { printf(“n***反转***nr”); } // clk = HAL_GPIO_ReadPin(DT_GPIO_Port,DT_Pin); // dt = HAL_GPIO_ReadPin(DT_GPIO_Port,DT_Pin); // key = HAL_GPIO_ReadPin(SW_GPIO_Port,SW_Pin); // if(1 == clk) // { // printf(“nclk == 1nr”); // } // else // { // printf(“nclk == 0nr”); // } // if(1 == dt) // { // printf(“ndt == 1nr”); // } // else // { // printf(“ndt == 0nr”); // } // if(1 == key) // { // printf(“nkey == 1nr”); // } // else // { // printf(“nkey == 0nr”); // } HAL_Delay(1000); } /* USER CODE END 3 */ } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //外部中断 回调函数 { if(GPIO_Pin == CLK_Pin) //检测到有变化就进来处理 { if(HAL_GPIO_ReadPin(CLK_GPIO_Port,CLK_Pin) == HAL_GPIO_ReadPin(DT_GPIO_Port,DT_Pin)) //clk pb0 == dt pb1 spped_counter=10; // 表示 正转 else spped_counter=100; // 表示 反转 } } 效果如下: |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1752 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1611 浏览 1 评论
1052 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
721 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1666 浏览 2 评论
1926浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
711浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
560浏览 3评论
583浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
544浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 13:34 , Processed in 0.891209 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号