stm32实现SSI接口

经验分享乌龟也会飞 发表了文章 • 1 个评论 • 169 次浏览 • 2018-08-22 13:53 • 来自相关话题

本文章采用的是2个IO口来模拟SSI协议接口读取MTS的绝对值编码器数据,经过验证一切oK第一步:首先需要配置io口一个输出 一个为输入第二步:定义较为准确的微秒级别的延时(SSI协议的对延时有较高的要求,两帧数据之间的间隔要求大于16us最好大于1倍以上32us比较保险,故此读取SSI编码器的数据时钟周期必须要小于16us,否则SSI编码器不停的认为开始了新的一帧数据发送,会致使结果读取失败)。可以采用定时器的方式来实现较为准确的延时可以参考http://www.stm32cube.com/article/176 文章 第三步:实现SSI协议接口(具体下一请百度)大概就是空闲没有数据交换时刻数据线和时钟线应该维持为高电平的状态 在第一个时钟下降沿时刻编码器锁存当前的位移值,然后再接下来的每个上升沿脉冲时刻将数据发送发送到数据线上,发送完成后SSI编码器会将数据线拉低16us然后恢复为空闲状态拉高数据线,故此两针数据的读取间隔必须大于16us我采用的是30us,然后空闲手机壳遇到时钟下降沿又是新的一帧数据开始我所实现的MTS传感器的24位数据(故此以下代码为24位SSI编码器读取代码,至于其他位数的编码器时序相同的话只需更改for循环的次数即可)以上提供by荒野大嫖客 如有疑问可以留言或者至cubeMX中文QQ群里 里面的大牛较多以下为FPGA实现SSI接口by 荒野大嫖客 查看全部

本文章采用的是2个IO口来模拟SSI协议接口读取MTS的绝对值编码器数据,经过验证一切oK

第一步:首先需要配置io口一个输出 一个为输入

第二步:定义较为准确的微秒级别的延时(SSI协议的对延时有较高的要求,两帧数据之间的间隔要求大于16us最好大于1倍以上32us比较保险,故此读取SSI编码器的数据时钟周期必须要小于16us,否则SSI编码器不停的认为开始了新的一帧数据发送,会致使结果读取失败)。可以采用定时器的方式来实现较为准确的延时可以参考

http://www.stm32cube.com/article/176 文章 

第三步:实现SSI协议接口(具体下一请百度)大概就是空闲没有数据交换时刻数据线和时钟线应该维持为高电平的状态 在第一个时钟下降沿时刻编码器锁存当前的位移值,然后再接下来的每个上升沿脉冲时刻将数据发送发送到数据线上,发送完成后SSI编码器会将数据线拉低16us然后恢复为空闲状态拉高数据线,故此两针数据的读取间隔必须大于16us我采用的是30us,然后空闲手机壳遇到时钟下降沿又是新的一帧数据开始

我所实现的MTS传感器的24位数据(故此以下代码为24位SSI编码器读取代码,至于其他位数的编码器时序相同的话只需更改for循环的次数即可)


image.png

以上提供by荒野大嫖客 如有疑问可以留言或者至cubeMX中文QQ群里 里面的大牛较多

以下为FPGA实现SSI接口

image.png


image.png


by 荒野大嫖客


STM32 HAL库实现微秒级别延时

经验分享乌龟也会飞 发表了文章 • 2 个评论 • 320 次浏览 • 2018-08-22 13:30 • 来自相关话题

HAL库函数中有延时函数HAL_Delay();进行毫秒级别的延时,但是在实际的开发中编写时序时有时需要进行较为准确的微秒级别延时像SSI协议接口等,本文章采用一个通用定时器的方式实现微秒级别的延时,而不采用滴答定时器是由于HAL库函数中很多地方需要使用滴答定时器进行超时判断,更改滴答配置恐引发意外,另外传统的for循环延时不太准确。首先配置使能定时器(我选择的是定时器6)第二步:配置定时器(当然在此步骤前默认读者已经完成了系统时钟的配置,F1系列我配置为72MHz,那么对于定时器6来说时钟也是72MHz)进行72分频(71+1)那么得出分频后定时器的时钟为1MHz即1us进行数据变化一次,根据这个思想,我将定时器配置为向上计数,自动重装,好方目前位置cubeMX配置方面已经完成了,生成工程就行第三步:打开工程 在tim.c 文本中的begin 和end之间添加以下代码即可/*********************************************功能:实现us级别延时***作者:荒野大嫖客***版本:V1.0*******************************************/void delayXus(uint16_t us){ uint16_t differ=0xffff-us-5; //设定定时器计数器起始值 __HAL_TIM_SET_COUNTER(&htim6,differ); HAL_TIM_Base_Start(&htim6); //启动定时器  while(differ<0xffff-6) //补偿,判断  {    differ=__HAL_TIM_GET_COUNTER(&htim6); //查询计数器的计数值  }  HAL_TIM_Base_Stop(&htim6);}第四步:将void delayXus(uint16_t us);添加至tim.h头文件中 在其他地方引用该头文件即可使用该延时,经过实际测试可得还是比较准备的以上整理提供by 荒野大嫖客 有问题可以一起探讨探讨或者cubemx中文QQ群发表 里面大牛比较多 查看全部

HAL库函数中有延时函数HAL_Delay();进行毫秒级别的延时,但是在实际的开发中编写时序时有时需要进行较为准确的微秒级别延时像SSI协议接口等,本文章采用一个通用定时器的方式实现微秒级别的延时,而不采用滴答定时器是由于HAL库函数中很多地方需要使用滴答定时器进行超时判断,更改滴答配置恐引发意外,另外传统的for循环延时不太准确。

首先配置使能定时器(我选择的是定时器6)

image.png

第二步:配置定时器(当然在此步骤前默认读者已经完成了系统时钟的配置,F1系列我配置为72MHz,那么对于定时器6来说时钟也是72MHz)

image.png

进行72分频(71+1)那么得出分频后定时器的时钟为1MHz即1us进行数据变化一次,根据这个思想,我将定时器配置为向上计数,自动重装,好方目前位置cubeMX配置方面已经完成了,生成工程就行

第三步:打开工程 在tim.c 文本中的begin 和end之间添加以下代码即可

/******************************************

***功能:实现us级别延时

***作者:荒野大嫖客

***版本:V1.0

*******************************************/

void delayXus(uint16_t us)

{

uint16_t differ=0xffff-us-5; //设定定时器计数器起始值

__HAL_TIM_SET_COUNTER(&htim6,differ);

HAL_TIM_Base_Start(&htim6); //启动定时器

  while(differ<0xffff-6) //补偿,判断

  {

    differ=__HAL_TIM_GET_COUNTER(&htim6); //查询计数器的计数值

  }

  HAL_TIM_Base_Stop(&htim6);

}

第四步:将void delayXus(uint16_t us);添加至tim.h头文件中 在其他地方引用该头文件即可使用该延时,经过实际测试可得还是比较准备的


以上整理提供by 荒野大嫖客 有问题可以一起探讨探讨或者cubemx中文QQ群发表 里面大牛比较多


关于stm32cube中UART串口的新库函数的一些东西理解,长久记录

经验分享風影旋新月 回复了问题 • 26 人关注 • 10 个回复 • 26553 次浏览 • 2018-08-20 16:24 • 来自相关话题

【求助】HAL库生成I2C主机代码,接收不了数据

回复

问题困惑去远方 发起了问题 • 1 人关注 • 0 个回复 • 88 次浏览 • 2018-08-20 10:29 • 来自相关话题

stm32l151中SD卡fatfs问题

问题困惑子西 回复了问题 • 2 人关注 • 3 个回复 • 163 次浏览 • 2018-08-19 11:28 • 来自相关话题

分享一个由串口uart接收命令,来动态调整tim定时器pwm模式脉冲宽度的小实验

软件教程想飞的四轴 回复了问题 • 41 人关注 • 19 个回复 • 9611 次浏览 • 2018-08-17 12:20 • 来自相关话题

I2S全双工主发送模式DMA方式问题

问题困惑杜玉西 回复了问题 • 2 人关注 • 1 个回复 • 2275 次浏览 • 2018-08-17 11:01 • 来自相关话题

学习RTC时候发现断电后储存的年月日信息会丢失,通过修改ST代码,解决了此问题

新手交流扬起嘴角,对你微笑 回复了问题 • 11 人关注 • 5 个回复 • 1806 次浏览 • 2018-08-16 17:13 • 来自相关话题

TrueStudio中,如何使用MDK的

回复

问题困惑周晓敏 发起了问题 • 1 人关注 • 0 个回复 • 199 次浏览 • 2018-08-16 13:30 • 来自相关话题

软件打不开

问题困惑lixinzhuang 回复了问题 • 2 人关注 • 2 个回复 • 69 次浏览 • 2018-08-15 22:28 • 来自相关话题

有没有大牛做过双线半双工串口

问题困惑井底添蛙 回复了问题 • 2 人关注 • 1 个回复 • 64 次浏览 • 2018-08-14 16:18 • 来自相关话题

keil4 软件使用求助!

问题困惑井底添蛙 回复了问题 • 2 人关注 • 1 个回复 • 72 次浏览 • 2018-08-14 14:03 • 来自相关话题

利用stm32cubemx移植freemodbus代码分享,片子是stm32F407,记录整个调试过程,供大家参考

软件教程兰生 回复了问题 • 74 人关注 • 31 个回复 • 21898 次浏览 • 2018-08-13 16:48 • 来自相关话题

请教stm32的HAL库中FreeRTOS的port.c出现的错误

回复

问题困惑诺之七城 回复了问题 • 1 人关注 • 1 个回复 • 195 次浏览 • 2018-08-13 10:20 • 来自相关话题

TIM1 PWMN 无输出?

问题困惑xia_yangchun 回复了问题 • 6 人关注 • 5 个回复 • 2798 次浏览 • 2018-08-11 16:18 • 来自相关话题