OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14181|回复: 11

哪位高手做过用STM32的SPI实现对外部SSI信号的采集?

[复制链接]

4

主题

14

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-5-11
在线时间
26 小时
发表于 2016-8-20 10:02:25 | 显示全部楼层 |阅读模式
1金钱

最佳答案

查看完整内容[请看2#楼]

定时器使用错误,直接用延函时数成功实现,这种方式速度最大可以达到400k左右。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

14

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-5-11
在线时间
26 小时
 楼主| 发表于 2016-8-20 10:02:26 | 显示全部楼层
定时器使用错误,直接用延函时数成功实现,这种方式速度最大可以达到400k左右。
回复

使用道具 举报

4

主题

14

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-5-11
在线时间
26 小时
 楼主| 发表于 2016-8-23 09:25:55 | 显示全部楼层
本人想用STM32做一闭环控制,需动态采集一种绝对值型磁致伸缩位移传感器的值(MTS 型号:RPM0280MD701S1G1100)传感器的基本参数:SSI方式输出、25bit、格雷码,时序图如下所示 QQ图片20160823084918.png 目前有几种方案选择:1.增加外部硬件电路将SSI信号转换为RS232或422/485再与STM32连接。2.用IO口模拟SSI接口,但这速度可能会变慢。3.用STM32的SPI,SPI的每帧数据长度是8位或16位无法与这种传感器输出方式匹配,在连续传送模式下能否实现对这种信号的读取?请各位师傅支支招,在此先谢谢大家了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-8-24 21:38:22 | 显示全部楼层
帮顶
回复

使用道具 举报

4

主题

14

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-5-11
在线时间
26 小时
 楼主| 发表于 2016-8-27 10:29:40 | 显示全部楼层
没人回复,自己顶一下。
  说说自己的看法:  对于第一种方案没找到相关的可以传化为普通可与STM32通信的USART信号的芯片,看到一则有用FPGA芯片转换为并口的应用,对于STM32来说不太实用太占用硬件资源了,这种方法好像行不通。第二种方案在低速下应该可行。从论坛没找到有关的应用,下面是本人写的一段代码(设定传输速度不大于50kbit)还没调试成功,欢迎大家纠正和交流。(硬件连接:分别通过两个MAX3485将SSI传感器的差分信号和时钟转换为TTL电平再与STM32的PIO口相连) QQ图片20160827101315.png
回复

使用道具 举报

4

主题

14

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-5-11
在线时间
26 小时
 楼主| 发表于 2016-8-27 10:31:22 | 显示全部楼层

RE: 哪位高手做过用STM32的SPI实现对外部SSI信号的采集?

lxhua 发表于 2016-8-27 10:29
没人回复,自己顶一下。
  说说自己的看法:  对于第一种方案没找到相关的可以传化为普通可与STM32通信的U ...

没人回复,自己顶一下。
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-8-27 11:14:04 | 显示全部楼层
数字电路的串转并不知道行不行,25位可以分两次用一个IO口读取,或是占用两个IO口一次读取。
回复

使用道具 举报

4

主题

14

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-5-11
在线时间
26 小时
 楼主| 发表于 2016-8-27 11:52:50 | 显示全部楼层
串转并可以,有用FPGA芯片做的,只不过25位太占IO口资源了。
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2016-10-8
在线时间
59 小时
发表于 2016-11-24 11:19:18 | 显示全部楼层
大神 有做出来吗  我这边也是读取ssi信号  还没有好的方法
回复

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2017-2-20
在线时间
9 小时
发表于 2017-5-20 13:30:47 | 显示全部楼层
我最近想了如下方法:
1.基于原子的PWM教程,使用定时器产生pwm波形
2.使用软件读取ssi的电平,可以做到任意位数,如下

int main(void)
{  
u16 led0pwmval=0;   
u8 dir=1;
u8 i=63;
uint64_t data=0;
Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
LED_Init();
delay_init(168);   //延时初始化   
KEY_Init();
TIM14_PWM_Init(21-1,2-1); //84Mhz的计数频率,2Mhz的PWM.
LED1=0;
    while(1)
{
  LED0_PWM_VAL=0; //此时脉冲的占空比是0,那么就全是高电平
  delay_ms(1);
  LED0_PWM_VAL=15;   // 此时来脉冲,占空比是1/3   如果LED0_PWM_VAL=10; 占空比是1/2
  for (i=63;i>0;)  // 此时暂定脉冲个数是64个
  {
   while(1)
   {
    if (KEY0==1) //将pwm的输出,即LED0,接到key0上
    {
     
     data|=(1<<i);
     LED1=!LED1;
     break;   
    }   
   }
   while(1)
   {
    if (KEY0==0)
    {
     break;
    }
   }     
   i--;
  }
  
}
}

其实原理很简单,将pwm的输出作为SSI的clk信号,同时将clk信号与arm的某一个pin短路,那么通过软件来寻找下降沿,当下降沿的时候,将数据采集进来。

1. 这个实验是基于ALIENTEK板子的
2.使用的是原子的pwm例程
3. 需要注意 在led.h 和led..c中,去掉了PF10的定义。因为原子的pwm例程使用的是PF10
4.为了验证采集,我将PE4和PF9短路,然后通过控制LED1的翻转来观察是否采集到了有效信号。
5. 可以看到,LED1的翻转的时候,pwm输出依然在高电平(此时模拟的是上升沿釆数),证明采集有效

波形附件,黄线是pwm,绿线是LED1的信号

scope_12.jpg
scope_13.jpg
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2024-2-17
在线时间
0 小时
发表于 2024-2-17 10:58:54 | 显示全部楼层
你好功能实现了吗?楼主
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4105
金钱
4105
注册时间
2018-8-14
在线时间
696 小时
发表于 2024-2-17 12:01:09 | 显示全部楼层
lxhua 发表于 2016-8-23 09:25
本人想用STM32做一闭环控制,需动态采集一种绝对值型磁致伸缩位移传感器的值(MTS 型号:RPM0280MD701S1G11 ...

换一下思路 1+3*8 bits 不就可以了么

1 CLK/DATA 配置为IO, 读取MSB(1bit) 数据
2 CLK/DATA 配置为 复用SPI
3 通过SPI读取余下的3x8bits
4 Delay 16us
5 重复步 1~4
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 06:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表