关于stm32的正交解码

简介: 关于正交解码,我先解释何为正交解码,,,,其实名字挺高大上的,,,,还是先说编码器吧看一下我用过的一种编码器编码器的 线 数 ,是说编码器转一圈输出多少个脉冲,,,如果一个编码器是500线,,,说明这个编码器转一圈对应的信号线会输出500个脉冲,,,,为什么说是对应的,,,对于上面的编码器...

关于正交解码,我先解释何为正交解码,,,,其实名字挺高大上的,,,,还是先说编码器吧

看一下我用过的一种编码器

编码器的 线 数 ,是说编码器转一圈输出多少个脉冲,,,如果一个编码器是500线,,,说明这个编码器转一圈对应的信号线会输出500个脉冲,,,,为什么说是对应的,,,对于上面的编码器而言是这样的,,,,但是有的编码器里面有好多线,,,有的信号线是转一圈就输出对应多少线的脉冲,,,有的信号线是转一圈就输出一个脉冲,,,,这就要看编码器的资料了......

看我上面用过的这个编码器,,使用A,B,VCC,GND这四根线,,

编码器转一圈A信号线会输出500个脉冲,,,,B信号线也会输出500个脉冲,,不过

正转的时候

反转的时候

正转的时候信号线A先输出信号,B信号线后输出

反转的时候信号线B先输出信号,A信号线后输出

假设只是单纯的测正转脉冲或者单纯的测反转脉冲,那么只需要用单片机随意选择一个信号线就行了,,然后就是脉冲计数,,,,

如果说要是一个电机既有正转又有反转,,,,我想知道这个电机绝对正转了多少圈

那么就需要用正转的圈数减去反转的圈数了,,,,,,那么问题来了,,,怎么测正转圈数和反转圈数

其实传统的做法

关于D触发器,,,,当clk引脚来一个上升沿,D引脚是什么电平,,那么Q就输出什么电平,,Q非,,与Q相反

现在如果说电机正转

可以看到每当B来上升沿的时候,A信号总为高电平,,,所以Q会输出高电平

设置A为上升沿进入其,,,中断函数

然后判断一下Q是否为高电平,如果为高电平正转变量自加一

如果电机反转

 

可以看到每当B来上升沿的时候,A信号总为低电平,,,所以Q会输出低电平

设置B为上升沿进入其,,,中断函数

然后判断一下Q是否为低电平,如果为低电平反转变量自加一

 然后 正转变量减去反转变量就能得到电机到底正转了多少圈......这样就会得到一个相对的变量,,这个变量呢,就是单片机正交解码的值

说白了单片机的正交解码功能就是得到一个正反转,,,相对的变量,,,,这个变量呢,,你正转的时候他会加,你反转的时候他会减,

不过呢,,,,STM32的这个变量有点坑,,,是太坑了,,,他内部定义的这个变量的类型是无符号整形,,,也就是说0---65535,,,,,,,,,,,,,

如果直接利用STM32的正交解码功能,,直接读这个值,,这样呢就会出现很麻烦的问题,,,,

假设你正转转到10,然后反转转到0之后还是反转,,他就会开始从65535开始往下减了,,,,假设转到了60000,,你又开始正转了,一直越过65535之后,他又开始从0开始往上加了,,,,要是你的电机就是这样的反反复复,而且正转与反转次数每次都在变化,,,,,,,你如何写程序来得到到底正转了多少圈??????????所以说STM32真是太坑了,,,害的我和我同学写算法测试算法耽搁了两天,,,,,,,最后还是会出现BUG,,,,,,,,网上也有大神写类似的算法来计算出到底转的圈数,,,,,,,,,,,,,,

最总我决定用最本质的方法也就是利用D触发器,,,,,,,不过因为手头并没有D触发器,,,但是STM32正交解码内部实质就是用的D触发器来做判断的,,,,,

而且他提供了一个寄存器来判断是正转还是反转

if((TIM3->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down)//向下计数

else

就是向上计数......也就是能指明正反转,,,,,

所以我就打开他的正交解码功能,,就是把A,B信号线既接正交解码引脚上,又接在脉冲计数中断引脚上

void EXTI0_IRQHandler(void)//反转中断
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET) //???????EXTI Line??
{
EXTI_ClearITPendingBit(EXTI_Line0); //???????
if((TIM3->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down)//???
{
cnt--;

}
}
}

/*************** ????1??,???? B1 *********************/
void EXTI1_IRQHandler(void)//正转中断
{
if(EXTI_GetITStatus(EXTI_Line1) != RESET) //???????EXTI Line??
{
EXTI_ClearITPendingBit(EXTI_Line1); //???????
if((TIM3->CR1 & TIM_CounterMode_Up) == TIM_CounterMode_Up)//???
{

if((TIM3->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down);//???
else
cnt++;

}
}
}

 

 这样的话省了D触发器了,,,,,,,

看了一眼K60的正交解码的变量

虽然是32位了但是,,,,,,,是无符号的,,,,,,如果只用正交解码功能,,反转又要考虑算法了,,,,,,,,,,,,,,,,,,,,,

 

 最后附上程序下载地址,,,,B1,A6接正转的那条信号线,,,,B0,A7接反转的那条信号线,,串口1,PA9..PA10,,,波特率115200会打印出来到底转了多少圈

http://pan.baidu.com/s/1pLPLyht  密码  9t84

其实并不是在说正交解码怎么用,,而是说正交解码是个怎么回事,,,,,,,

目录
相关文章
|
芯片
STM32入门开发: NEC红外线协议解码(超低成本无线传输方案)
STM32入门开发: NEC红外线协议解码(超低成本无线传输方案)
707 0
STM32入门开发: NEC红外线协议解码(超低成本无线传输方案)
|
5月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
447 2
|
4月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
715 0
|
6月前
|
传感器
STM32标准库ADC和DMA知识点总结-1
STM32标准库ADC和DMA知识点总结
|
5月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
509 4
|
5月前
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
696 2
|
5月前
|
存储 数据采集 数据安全/隐私保护
使用STM32F103读取TF卡并模拟U盘:使用标准库实现
通过以上步骤,你可以实现用STM32F103将TF卡内容变成U盘进行读取。这种功能在数据采集、便携式存储设备等应用中非常有用。如果你有更多的需求,可以进一步扩展此项目,例如添加文件管理功能、加密存储等。希望这篇博客能帮到你,如果有任何问题,欢迎在评论区留言讨论!
238 1
|
5月前
|
开发者
【经典案例】使用HAL库配置STM32F407的SPI外设
在嵌入式系统开发中,STM32F407是一款广泛应用的微控制器,而SPI(Serial Peripheral Interface)是一种常用的通信接口。本文将详细介绍如何使用STM32的硬件抽象层(HAL)库配置STM32F407的SPI外设,并提供完整的代码示例。
571 1
|
4月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
164 0