历史上的今天
返回首页

历史上的今天

今天是:2025年05月13日(星期二)

正在发生

2021年05月13日 | STM32的曼彻斯特编译码系统设计

2021-05-13 来源:21ic

引言


由于曼彻斯特(MancheSTer)编码具有传输时无直流分量,时钟提取方便等特点,被广泛地应用于以太网、车辆总线、工业总线中。现在工程上常用的曼彻斯特编译码芯片为HD-6408和HD-6409,但是这种芯片有一些不足。首先,该芯片在传输速率和每帧数据中的有效位数等方面都做了严格的限制。其次,使用该芯片需要增加额外的硬件电路,提高了系统成本。使用FPGA做曼彻斯特编译码成本高,而且开发周期长。本文提出了一种基于STM32F103RET6的编译码系统方案,利用了STM32F103RET6强大的定时器功能,采用灵活的编译码方式,传输速率和数据帧格式都可以根据需要完全自行定义。


STM32F103RET6自带DMA的功能使得数据编码不再需要频繁的定时中断,提高了编码速率,节约了CPU的资源。该设计方案实现方法简单、稳定、灵活,应用范围广泛。


1 曼彻斯特码


曼彻斯特编码是一种自动同步的编码方式即时钟同步信号就隐藏在数据波形中。在曼彻斯特编码中,每一位的中间有一跳变,位中间的跳变既作为时钟信号,又作为数据信号。每个码元均用两个不同相位的电平信号表示,与用高、低电平表示的非归零二进制码相比,在连“0”或连“1”的情况下更易于提取同步时钟信息。并且曼彻斯特码传输时没有直流分量,可以降低系统的功耗,且有很强的抗干扰能力。图1所示是最常用的一种曼彻斯特编码方法,当传送信号为“1”时,曼彻斯特编码由高电平跳变为低电平;若传送的信息为“0”,曼彻斯特由低电平跳变为高电平,在一个数据周期内保持低电平无跳变则表示空闲。


2 STM32F103RET6的定时器与DMA简介


控制器采用ST公司的STM32微处理器,STM32系列微处理器基于ARM Cortex-M3内核,采用高效的哈佛结构三级流水线,达到1.25DMIPS /MHz,这里我们选用增强型的STM32F103RET6.它具有如下特征:72 MHz系统时钟频率、512 KB闪存程序存储器、64 KBSRAM、8个定时器、3个12位模数转换器、1个数模转换器,1个CAN接口、7通道DMA控制器,以及SPI、USART、I2C、I2S、USB接口等。该控制器具有丰富的外设和较强的抗干扰能力,很适用于工业现场控制。


STM32F103RET6有8个定时器,每个定时器由一个可编程预分频的1 6位自动装载计数器构成,计数频率高达72 MHz,它适用于多种场合包括输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较或者PWM)。


STM32F103RET6支持DMA操作,DMA是在外没和存储器之间或者存储器和存储器之间的高速数据传输通道,通过DMA数据可以快速地移动而无需CPU的参与,这就节省了CPU的资源来做其他事情。本次设计便是利用计数器触发DMA进行内存与定时器的数据交换,比起中断查询的方式,提高了编码的效率和稳定性。


定时器的计数频率最高为72 MHz,DMA传输速率为6 Mb/s,因此曼彻斯特编码的速率可以很轻松的做到1 Mb/s,满足高速编码的需求。


3 系统实现方案


基于STM32F103RET6的曼彻斯特电压、电流编译码系统框图如图2所示。该系统设计主要使用STM32F103RET6芯片的定时器加DMA功能来实现曼彻斯特的电压编译码,对于电流编码译码需要借助外围的电压与电流转换电路来实现。

3.1 电压编码


将定时器设置为输出比较翻转功能,申请一个缓存区,将要编码的数据通过编码算法转换为翻转匹配值放入此缓存区,如图3所示的ABC DEF……计数值,编码算法根据具体应用中的编码协议来编写。启动定时器后,计数器开始计数,当计数值与定时器比较寄存器的值匹配时,输出引脚的电平进行翻转并触发DMA从缓存区来更新比较寄存器;每更新一次,DMA指向的内存地址递增1,指向下一次要更新到比较寄存器的数据,以此方式实现定时器根据缓存区的数据输出对应的编码波形。编码速率可通过修改定时器预分频器和RCC时钟控制器分频器来进行调节。

3.2 电压译码


将定时器设置为输入捕获功能,当曼彻斯特码的上升沿或下降沿到来时定时器会将当前的计数值进行捕获,并经由DMA通道传输到缓存区;主程序中会调用译码算法来对缓存区的数据进行处理并进行译码,译码作为编码的逆过程,其译码算法也要根据具体应用中的编码协议来编写。


3. 3 电流编码


将电压编码通过图4所示的电压/电流转换电路来实现,将定时器输出的曼彻斯特电压编码转换为曼彻斯特电流码。


3.4 电流译码

将待测的曼彻斯特电流码信号通过电流/电压转换为电压码,进行整形使边缘变陡峭后交MCU来译码,电流/电压转换电路如图5所示。


4 软件设计

软件流程如图6所示。系统初始化包括时钟初始化、定时器初始化、DMA初始化等。如果一次性连续编码的数据最比较大时,应将这罩的DMA缓冲区设置为双缓冲,为每个用到的DMA通道开辟两个缓冲区。当DMA使用其中的一个缓冲区时,MCU调用编码或者译码算法来对另外一个缓冲区进行读写操作;当DMA数据传输完毕的时候,发生一个DMA传输结束中断,在中断服务程序里切换到另外一个缓冲区,并将编码算法或者译码算法标志位置位。当主程序查询到标志位置位后,MCU调用编码或者译码算法来对DMA先前指向的缓冲区进行处理(填充数据或者取数据)。当然,如一次性编码或者译码的数据不是很多时,我们只需一个缓冲区就够了。

因为CPU处理数据的速度要高于编码的速率,所以CPU可以空出时间来做其他的事情,时间的长短依赖于缓冲区的大小和编码的速率,等到主程序中查询到编码或者译码标志位置位了再去执行编码或者译码算法对数据进行处理,这样就提高了CPU的工作效率。在实时性要求不高的应用中,不再需要一个专门的CPU去处理编码或者译码。


5 方案验证


本方案已在汽车加速度传感器模拟系统中得到了验证,这里以某款加速度传感器的曼彻斯特编码协议为例,其数据帧格式为一帧数据为19位包括:2个起始位、2个类别位、10个数据位、5个CRC效验位。


5.1 编码方案验证


对图4所示电路的T1点测量曼彻斯特电压编码的波形,电流编码的波形通过测量T2、T3问的压降来间接测量。

对一帧数据0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1连续编码,帧之间延时6μs,编码速率400kb/s,编码波形如图7所示。


5.2 译码方案验证


通过对某真实传感器输出的曼彻斯特电流码进行捕获译码,得到其ID信息,译码数据如图8所示。ID正确,译码成功。

结语

该没计方案可以方便地实现曼彻斯特电压、电流编码译码,实现方法灵活、可靠,适用于各种类型的曼彻斯特编码译码应用领域。目前,本设计方案已经成功地应用在汽车加速度传感器模拟系统中。


推荐阅读

史海拾趣

登丰微(GSTEK)公司的发展小趣事

歌普电子始终将产品质量视为企业的生命线。公司采用精细化管理模式,并严格执行ISO9001质量管理体系,确保每一件产品都达到高标准。同时,歌普的产品还通过了UL、CSA、TUV等国际安全认证及RoHS2.0、REACH欧盟绿色环保检测,进一步证明了其产品的可靠性和环保性。这些努力使得歌普在市场上获得了广泛的认可,与众多知名企业建立了长期稳定的合作关系。

Eaton公司的发展小趣事

伊顿公司起源于1911年,由Viggo Torbensen和年轻商人Joseph Eaton共同创建的Torbensen齿轮轴承公司,这是伊顿的前身。Joseph Eaton坚信战略收购是拓展业务的最佳方法,因此在公司的发展过程中,他积极推动了一系列重要的收购活动。随着时间的推移,公司的产品逐渐多元化,从最初的齿轮轴承扩展到更广泛的能源管理领域。到1932年,公司更名为伊顿制造公司,进一步彰显了其向多元化发展的决心。

Advanced Fibreoptic Engineering Ltd公司的发展小趣事

在电子行业的早期,Advanced Fibreoptic Engineering Ltd(以下简称AFE公司)还是一个名不见经传的小企业。然而,随着技术的不断进步,AFE公司凭借其在光纤技术领域的深厚积累,成功研发出了一种具有划时代意义的新型光纤材料。这种材料不仅传输速度快,而且损耗极低,极大地提高了数据传输的效率和质量。这一技术突破迅速为AFE公司赢得了市场认可,公司的订单量激增,业绩逐年攀升。

随着技术的推广和应用,AFE公司的光纤产品逐渐在通信、医疗、工业等多个领域得到广泛应用。公司不仅在国内市场占据了一席之地,还积极拓展海外市场,与国际知名企业建立了稳定的合作关系。凭借卓越的产品性能和良好的市场口碑,AFE公司逐渐在电子行业中崭露头角,成为了光纤技术领域的佼佼者。

以上是第一个故事的示例,若您想要探索更多关于AFE公司的发展故事,请输入继续。

(注:由于我无法实时获取具体公司的实际发展故事,以上故事为虚构内容,仅用于展示故事编写风格和结构。如果您需要真实、具体的故事,请提供更多关于AFE公司的信息,以便我能为您编写更贴近实际的内容。)

Good Will Instrument Co., Ltd.公司的发展小趣事

对于恒温箱控制器电路,网友可能会有多种问题,以下是一些常见问题及其详细回答:

一、恒温箱控制器电路的基本原理是什么?

回答
恒温箱控制器电路的基本原理是通过温度传感器(如热敏电阻、热电偶等)实时检测恒温箱内的温度,并将检测到的温度信号转换为电信号(如电压或电流信号)。这个电信号随后被送入控制器中进行处理,与预设的温度值进行比较。如果检测到的温度高于或低于预设值,控制器会发出指令,通过调节加热元件(如电热丝、加热管等)或制冷元件(如压缩机、半导体制冷片等)的工作状态,使恒温箱内的温度回到预设值,从而实现恒温控制。

二、恒温箱控制器电路常见的故障有哪些?

回答
恒温箱控制器电路常见的故障包括但不限于以下几种:

  1. 温度显示异常
    • 可能原因:温度传感器损坏、控制器内部电路故障、显示屏故障等。
    • 解决方法:检查并更换损坏的温度传感器、修复或更换控制器内部故障电路、更换显示屏等。
  2. 温度控制不准确
    • 可能原因:控制器参数设置错误、温度传感器位置不当、加热/制冷元件故障等。
    • 解决方法:重新校准控制器参数、调整温度传感器位置、检查并修复加热/制冷元件等。
  3. 控制器无法启动
    • 可能原因:电源故障、控制器内部保险丝熔断、电路板短路等。
    • 解决方法:检查电源是否正常、更换熔断的保险丝、修复电路板短路等。

三、如何检查恒温箱控制器电路是否正常工作?

回答
检查恒温箱控制器电路是否正常工作,可以按照以下步骤进行:

  1. 检查电源
    • 确认电源插头是否牢固插入插座,电源线是否完好无损。
    • 使用万用表测量电源电压,确保在控制器要求的范围内。
  2. 检查温度传感器
    • 使用万用表测量温度传感器的电阻值或电压值,与标准值进行比较,判断传感器是否正常。
    • 检查传感器与控制器之间的连接是否牢固可靠。
  3. 检查控制器显示
    • 观察控制器显示屏上的温度读数是否准确,有无异常显示。
  4. 检查加热/制冷元件
    • 检查加热/制冷元件是否正常工作,可以通过观察其工作状态或使用万用表测量其电流/电压值来判断。
  5. 进行功能测试
    • 设置一个预设温度值,观察恒温箱是否能准确达到并保持在预设温度。
    • 如果条件允许,可以使用更精确的温度测量设备(如高精度温度计)对恒温箱内的温度进行校验。

四、如何维护和保养恒温箱控制器电路?

回答
为了保持恒温箱控制器电路的长期稳定工作,可以进行以下维护和保养工作:

  1. 定期清洁
    • 定期清洁恒温箱内部和外部的灰尘和污垢,防止对控制器电路造成不良影响。
    • 清洁时应断开电源,并使用合适的清洁工具和清洁剂。
  2. 检查连接
    • 定期检查温度传感器、加热/制冷元件与控制器之间的连接是否牢固可靠,如有松动应及时紧固。
  3. 校准参数
    • 定期对控制器进行校准,确保温度读数准确可靠。
    • 校准时应按照控制器的使用说明书或生产厂家的建议进行操作。
  4. 更换老化部件
    • 对于已经老化或损坏的部件(如温度传感器、加热/制冷元件等),应及时进行更换。
  5. 注意使用环境
    • 恒温箱应放置在通风良好、干燥清洁的环境中,避免阳光直射和潮湿环境对控制器电路造成损害。
  6. 定期维护
    • 定期对恒温箱进行全面检查和维护,包括控制器电路、加热/制冷系统、进出料装置等部分。
    • 维护时应按照设备的操作手册和生产厂家提供的维护保养指导进行。
ELMOS公司的发展小趣事

ELMOS作为一家欧洲公司,在世界各地都设有研发和销售办事处。这种全球化的布局使得ELMOS能够更好地了解不同市场的需求,为客户提供更加贴近市场的产品和服务。同时,通过与全球各地的客户和合作伙伴的紧密合作,ELMOS不断拓展其国际市场份额,进一步提升了公司的国际影响力。

Arduino公司的发展小趣事

随着物联网和智能设备的兴起,Arduino平台在智能家居、智能农业、机器人等领域的应用越来越广泛。开发者们可以利用Arduino平台来设计和开发各种智能设备和应用,实现设备的互联互通和智能化控制。这些应用不仅提高了人们的生活质量,也推动了电子行业的进步和发展。

这五个故事展示了Arduino公司在电子行业中的发展历程和取得的成就。从最初的廉价微控制器解决方案,到如今的多样化主板和广泛应用,Arduino始终秉持着创新、开放和合作的精神,为电子行业的发展做出了重要贡献。

问答坊 | AI 解惑

分享你的体验,精彩大奖等你拿!

罗德与施瓦茨 2009年射频微波测量仪器应用 有奖征文竞赛启事 一等奖1 名;奖励价值6000元的奖品 二等奖 3 名;奖励价值4000元的奖品 三等奖若干名:奖励价值1000元的奖品 为了推动射频微波测试与测量技术的发展,适应客户的测试应用需 ...…

查看全部问答>

rs485总线

1490B为全双工方式,如何将其转换为半双工?我只能单独的发送和单独的接收,但并不能实现其半双工工作方式,请问问题出在哪?谢谢~~~…

查看全部问答>

台湾新茂(SyncMOS)与爱特梅尔(ATMEL)8051内核单片机替换

台湾新茂(SyncMOS)与爱特梅尔(ATMEL)8051内核单片机替换表 SM8952AC40PP/JP/QP=AT89S52-24PU/JP/AU SM8958AC40PP/JP=AT89C55WD-24PU/JP SM894051C25PP/SP=AT89C2051-24PU/SU SM894051C25PP/SP=AT89C4051-24PU/SU 深圳市鼎尚电子有限公司, ...…

查看全部问答>

那位大哥有S3C2443 BSP包

那位大哥有S3C2443 BSP包,小弟愿意用其它软件交换。…

查看全部问答>

evc操作sql server CE时,如何捕捉到错误信息?

evc操作sql server CE时,如何捕捉到错误信息? 在VC操作sql server 2000时,我们可以通过: try { ... ... } catch( _com_error &e ) { ... ... } 得到出错的原因,在调试时非常方便,但是evc操作sql server CE时我该如何处理呢?谢谢大 ...…

查看全部问答>

CE的内存结构

在某个虚拟地址空间中,把物理地址空间重复地映射了一遍. 为什么要重复映射,重复映射的部分与先前映射的部分有什么区别?…

查看全部问答>

结构数组可以单个变量组可以调用吗

假如定义一个     struct string{ uchar classs;                                 uchar old;      ...…

查看全部问答>

菜鸟弱问:新建工程打不开头文件!

新建了一个工程 #include "stm8s.h" #include "stm8s_gpio.h" main() { GPIO_Init(GPIOC,GPIO_PIN_1,GPIO_MODE_OUT_OD_LOW_FAST); while (1); } #error cpstm8 main.c:6 can\'t open stm8s.h #error cpstm8 main.c:7 can\' ...…

查看全部问答>

STM8L的LCD控制器怎么使用啊?是不是非要LSE时钟才行啊?

我不想用LSE时钟,我看到手册上说LCD控制器可以使用RTCCLK/2当做时钟输入;也可以直接使用SYSCLK,只需要开启外设时钟的LCD就行。但是我写的程序,COM和SEG咋动都不动一下呢?用示波器看,动都没动,郁闷;下面是几行代码: void LCD_INIT(vo ...…

查看全部问答>

请问P0接蜂鸣器该怎么接?

怎么接呢?给个图吧,谢谢。…

查看全部问答>