发帖数

53

原创数

53

关注者

11

阅读数

10236

点赞数

1

黄忠

  • TTL通往RS232神奇之黑盒(一)

        大家好!我是张飞实战电子黄忠老师。

        做单片机通信的,这些不同通信接口转换的模块是必不可少的,都说这些模块那么多,又不贵,那我索性也来做一个,全隔离的TTL转RS232模块,在这里就跟大家分享下我的实现过程,还有需要注意的地方。如果大家有不同的看法随时欢迎交流哈~

    首先呢先来说下需要实现什么,就是TTL转RS232,那么就可以来选择芯片,有信号隔离芯片、电源隔离芯片、转换芯片,主要就是这些。

        那么接下来我就来详细分享下我的实现过程。

        1、输入端电压我设计的是5V供电,因为后端我选取的DCDC隔离电源需要5V供电,所以这里需要提示下的。输入进来加个保险丝(9V/100mA),起到保护作用。还有输入端我一般会选择加个LED灯,提示用的。

    图片1.png 

        2、信号输入后开始进行全隔离,信号通过隔离芯片实现,电源信号通过隔离电源,实现全隔离;信号线一般需要加个小电阻(10R够了)增强鲁棒性,对于隔离部分处理相对简单,看图吧

    图片2.png图片3.png 

        3、接下来就是转换芯片(SP3232EIM/TR)部分了,对于RS232的信号,我做了功课,这里简单说明下,RS232信号0和1与TTL不一样,TTL工作电压是0~3.3V,RS232逻辑1电平是低于-3V的(保证电平在-3~-15V);逻辑0电平是高于3V的(保证电平在3~15V)接通状态呢有效电平高于3V,断开状态电平低于-3V,也就是当传输电平绝对值大于3V时,电路可以有效的检查出来。

    通过阅读RS232转换芯片的数据手册,看下对于电荷泵电容的说法,

     

    图片4.png 

    图片5.png图片6.png 

    那么我的设计就参照手册的推荐设计,另外我选用的芯片可以实现两路转换,我只用了一路。对于有芯片的设计还是要多看手册。

    4、最后就是输出部分的端口了,DB9接口,这个也要查询下相关资料,这里我跟大家分享下我查询的结果还有我的端口设计。

    图片7.png 

    图片8.png图片9.png 

    图片10.png 

        最后需要注意的是:主控目标和隔离模块通讯才用 杜邦线连接,隔离模块和从控目标通讯采用带有DB9接口的线材连接,这里需要注意带有DB9接口的线分TX和RX交叉、不交叉两个版本,采购时切记分清楚。

        那么这个小模块的设计就完成了,是不是觉得其他我们平时买的黑盒内容也没想象中那么复杂,技术需要沉淀,不管做软件设计也好,硬件设计也好,真的都要去实际完成才会有不一样的收获。或者在我的设计基础上也可以有不同的见解,还可以有更好的升华。思路需要开阔,当有了丰富的经验,设计什么都会变得容易的多。更多的积累才会换来更大的财富。

        后面就开始设计PCB过程了,最后产品出来就可以通信使用了,如果大家感兴趣的话就持续关注我吧。后面会陆续分享出我的设计视频过程,随时欢迎大家跟我来探讨,也让我可以开阔下思路,或许还有其他实现方式。


    收藏 0 回复 0 浏览 106
  • TTL通往RS232神奇之黑盒(二)

         延续前篇,跟大家分享了全隔离模块的通信接口转换原理设计过程,那么接下来就分享下我的PCB设计路程,有些过程看似简单,自己真正动手才发现自己可能会出错的点在哪里,这就是积累经验的过程。

    PCB实现也是一样的,需要细致,需要根据实际情况做出调整。

    首先是左进右出原则,根据实际需求,这个不是固定的。

    在布局前还是要先把规则设置好,有了规则自然事情就会变得有了约束,做事就不会没条理了。那么规则设置是需要注意什么呢。

        1、电气特性是必要配置的,间距设置,常规设置为0.2mm,敷铜间距可以稍微大点,我会设置为0.5mm。(这个间距要根据实际项目需求)

        2、线宽需要设置,首先我常规走线都是用推荐值,但是电源和地的线宽我用的大点,所以这里需要把范围配置一下,主要还是规避错误嘛。

    图片11.png 

        3、过孔的孔径常规我用0.3mm/0.6mm,那么对于限制就要设置好,否则也会报错的吧。

    图片12.png 

        4、还有一些间距为了自己去把控,我一般会设置为0,比如孔到孔的间距,最小阻焊的间距,丝印到阻焊的间距,丝印到丝印的间距等。

        规则设置好,就可以开始布局了。

        有信号隔离,那么隔离电源和隔离芯片也是要考虑敷铜的问题,所以布局需要考虑摆放问题。

     

    图片13.png 

        由于RS232接口尺寸问题,需要考虑最大,那么右端整个部分就是要放RS232,所以考虑合理化,那么隔离芯片部分就放在上端了,先模块化说完,后面贴整个效果图,那么大家就可以理解了。

    接下来看转换芯片和后端部分模块。

    图片14.png 

        这个布局除了要考虑放置问题,敷铜问题,还有就是走线。

        那么布局就实现了,接下来走线就不多说了,主要走线要先走信号线,最后走电源和地线,地常规都是通过敷铜方式实现,那么最终效果看下:

    图片15.png 

        最后需要提醒一点是泪滴效果。丝印调整以及版本号等信息的添加。

        到这里基本功能实现了,就是打板了,最后产品出来就可以通信使用了,如果大家感兴趣的话就持续关注我吧。后面会陆续分享出我的设计视频过程,随时欢迎大家跟我来探讨,或许还有其他实现方式。


    收藏 0 回复 0 浏览 90
  • 不要再找啦,关于Cortex-Mx芯片的启动没有比这里更清楚啦!

    Cortex-Mx启动流程步骤详解

    单片机在上电的时候会经历一个启动的流程,不管是你从手册描述上看得见的,还是看不见的,亦或者你不知道还有这种操作的,这个启动都是客观事实存在的,今天我们就用白话文来唠一唠Cortex-Mx系列的启动流程(此文章知识广泛适用于CPUCortex-Mx系列的MCU)。

    图片16.png 

    1

    如上图为STM32F0系列单片机系统存储器的映射图(其他系列型号,映射图会有区别,但流程还是一样的),通常,当处理器从复位中启动时,它首先会访问位于0x0000 0000地址的向量表这个向量表是什么?从哪里来?跟程序员又有什么关系?明确的讲这几个问题跟我们的启动文件是紧密相关的。启动文件就是对启动流程的“展现”,启动文件中包含了向量表(向量表中包含了堆栈指针地址、复位向量程序地址、以及系统中各类中断函数的入口地址,简单点讲就是单片机启动的时候得经过这个向量表,执行复位程序得经过这个向量表,执行中断还得经过向量表,从向量表中找中断函数的入口地址)。当然启动文件也是由程序员写的(只不过大多数由厂家的Coder代劳了)。下面我们一起来弄清楚吧!

    图片17.png 

    2VectorTable部分截图)

    上图为厂家参考手册上给出的向量表的部分截图,启动文件中程序员编写的向量表就是根据这个表格来编写的,每一行为向量表的一个组成成员,第一行为表示堆栈指针初始值,第二个字为复位向量地址,后面的行是各种类型的中断向量地址,也就是中断函数的入口地址(在图中第一个字被描述为保留,第二个字描述为复位,这两行内容非常重要!)。

    前面我们说了一个关键点当处理器从复位中启动时,它首先会访问0x0000 0000地址处的向量表,并读取向量表的前2个字,第一个字为堆栈指针MSP初始值堆栈是一个临时的空间,用来临时存储一些信息,就像电影里面的“龙门客栈”一样,供过往客人临时歇脚。;第二个字为复位向量,它表示程序执行的起始地址。当读取到地址之后,会自动到复位向量处开始执行程序2红框处,最右边的一列地址栏,第一行地址空间从0x0000 0000开始 - 0x0000 0003结束,第二行从0x0000 0004开始-0x0000 0007结束,后面以此类推,每行占4个字节,即1个字)。

    但是比较晕的是:图1中大家可以看到,地址0x0000 0000已经存在内容了,是系统BOOT的配置,这段内容是厂家固化的一段代码,我们的代码是存储在从0x0800 0000开始往后的地方Main Flash Memory存储区见图1)。

    大家想我们写的代码启动文件也算写的代码的一部分),是放在FLASH存储区的单片机上电的时候是从0x0000 0000处开始执行,那么系统是怎么访问到我们自己写的这个向量表呢

    这个设计者考虑了,系统会自动把我们代码启动文件中的向量表映射到0x0000 0000地址处,也就是说在0x0800 0000开始存放代码的地方我们有一张自己写的向量表,系统会找到这张向量表,把这张向量表映射到0x0000 0000处这样就相当于在0x0000 0000开始的这个地方也有了一张向量表了。

    图片18.png 

    3

    如图3,系统一旦读取到向量表的第二个字复位向量的地址,那么就跳到复位向量的地址开始执行程序我们可以在复位向量地址处写上自己的用户代码,执行完这段代码之后,指挥程序跳到主函数main程序运行那么这样连贯起来,程序正常跑起来了这就是一个完整的启动

     


    收藏 0 回复 0 浏览 191
  • 讲解ADC模数转白话

    首先我们来简单介绍一下ADCADCAnalogToDigitalConverter简单来讲就是它可以把模拟量转化为数字量方便程序去处理

    下面我们来看一下ADC的框图,我们从框图上来介绍ADC采样的原理

    图片19.png 

    1. 外部被采样信号从单片机特定的引脚输入ADC模块,具体信号从哪个采样引脚输入,取决于‘通道选择’配置。

    2. 当正常开始采样后,被采样信号在规定的时间(即采样时间)内对图中的电容(即采样保持电容,简称采保电容)充电,当充完电之后会控制图中的开关断开,这个过程就像科学家提取了一份标本,拿回实验室研究一样。

    3. 当开关断开之后,图中的转换模块会花费一定的时间(即转换时间)对电容中的存的电压进行转换,并把转换的结果存入缓冲器,供程序员读取使用,同理,就像科学家对提取的标本花时间研究,得出一个结果。

    以上就是整个的ADC工作过程,虽然草草几段话了解,但是其中不乏很多关键的细节问题,什么细节问题呢,很多老铁会想,这不都是自动的嘛,有嘛要注意的,那么我们先来看一下这样几个问题。

    1. 采样时间设置多久?

    2. 采样时间是越短越好还是越长越好?

    3. 采样时间设置的大小和被采样信号的源内阻有什么关系?

    4. 如何从有干扰的信号中提取有用的采样信号,实现正确采样?

    5. 采样的结果和参考电压有什么关系?

    现在我们就上面几个问题,展开说明:

    上面的描述可以得到:从采样到转换完成中间2个时间采样时间+转换时间转换时间是固定的,采样时间可以设置),这两个时间决定了ADC采样的速度问题当需要高速AD采样的时候,这两个时间尤为重要因为它决定了采样速度

    我们再回头来想这里是被采样信号先对采保电容充电因为转换时间是固定的我们能配置的就只有采样时间了是不是说采样时间我们配置的越小越好呢答案是:不是的,最起码得保证采保电容电压和被采样信号的电压非常接近吧如果一味的小,追求速度快,采保电容充不满,转换出来的数据也不对

    那就带来了一个问题这个被采样信号源内阻的问题说白了就是对这个采保电容充电的电流够不够大只有充电的电流大了,才能在最短的时间内充满如果充电的电流非常小,恰恰配置的采样时间很小,结果只有一个,采样不准确我们经常看到,有的设计方案,做电压采样,分压电阻设计的阻值非常大当这样的大阻抗遇到高速采样,那就有可能会不准确了

    图片20.png 

    大家看上面的R1R2设置大了,那么充电电流就小了那么R1R2的阻值设计小了,充电电流大了,那么带来的问题功耗就大了当需要高速采样的时候,就需要注意这个阻值分配的问题对功耗要求比较高的产品,如可穿戴产品,蓝牙耳机,智能手表等,这个就需要大的阻值了一般情况下功耗要求不高的场合,我们基本上设计在1-2mA所以从此可以得出一个结论,采样时间不是越快越好,也不是越慢越好,恰到好处即可,需要你去实际调试。

    如何从带有干扰杂波的信号中提取到有用的信号呢,一般情况下,我们会根据系统的特性进行定点采样,即避开干扰区来采样提取有用的信号,再配软件或者硬件滤波手段来提取有用信号。

    采保电容得到了准确的采样信号,就一定意味着转换结果准确吗?答案肯定

    NO,这个和参考电压也有关系,参考电压就像一标准样品一样,举例来讲:老板说照着这个样品给我做100个,那首先前提是你的样品得准确,如果样品都不准确,那做出来的东西也必然会有偏差。

    想必通过上面的描述我们已经对ADC采样有了一定的理解认知,上面的描述只是ADC的一部分要点,介于篇幅原因,这里就不再赘述了,文末留个大家几个问题:大家看图中绿色地方电容这个电容加了好还是不加好?加多大好?在布板的时候这个电容应该摆放在哪里比较好?

    图片21.png 



    收藏 0 回复 0 浏览 132
  • STM32中断如此简单

    大家好,我是张飞实战电子黄忠老师,下面我们先来了解一些基本概念:

    中断:中断是什么?举个例子来说,当我们正在工作时,突然电话响了,这时你会把手里的工作先停下来,然后去接电话,当接完电话后,电话里的人安排你马上做一件事,这时你需要立刻去做这件事,当把这件事做完后你会继续之前被打断的工作,这个过程为一次中断。

    异常:一个系统本应该正常的运行,但由于某些条件使系统产生了错误,就会使系统运行不正常,我们称之为异常。就好比一个健康的人,如果身体某个器官出现了问题,那他将会生病,不能像以前那样健康生活,称他的身体出现了异常。系统出现异常,我们必须对异常做出处理,才能让系统正常运行。

    事件:比如一个老师在教室里给学生上课,下面的学生会做出各种不同的动作,如有认真记笔记的,有讲小话的,有翻自己书包的等等,我们把学生的这些行为称为事件。但老师对这些事件有些是不会有动作的,有些事件是需要老师干预的,比如两个学生讲话,影响了老师上课,老师需要警告讲话的学生,然后再继续上课。

    优先级:当我们接到了两个电话,两个电话都安排你去做别的事,这时你需要先完成比较急的事,然后再完成不是太急的事,这就是优先级的问题。当有多个中断时,我们需要根据中断优先级判断先响应优先级高的中断,然后再响应优先级低的中断。

    中断与事件的联系与区别:有些事件需要响应,称这个事件为可中断事件,但有些事件不需要做出响应称这些事件为不可中断事件。当硬件正常连接时,对应事件会自动产生,但中断则需软件配置相应的中断使能位。

    抢占式优先级和响应优先级:所谓抢占式优先级和响应优先级,具有高抢占式优先级的中断可以在低抢占式优先级中断处理过程中被响应,即中断嵌套。当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后 才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。每一个中断源都必须定义2个优先级。

     

    STM32的中断管理利用了NVIC(Nested Vectored Interrupt Controller)嵌套向量中断控制器,它把所有的外设中断和系统异常用一张向量表来管理,每个系统异常和外设中断都被分配相应的地址,除了一些系统异常的优先级不能改变外,其余的系统异常和中断的优先级都可变化。具体向量表部分截图如下图所示:

     图片27.png图片28.png        

    29.png                  

    其中包含10个系统异常,有82个外部中断地址,其中有11个被保留,没有使用,从上表可查出对应的默认优先级和地址分配情况。

    NVIC是嵌套向量中断控制器,它控制芯片所有中断功能,是Cortex-Mx内核里的一个外设下图为Cortex-M4内核NVIC寄存器的分布图:

    30.png 

    从上图可以看出,Cortex-M4内核NVIC嵌套向量中断控制器总的有7个类型的寄存器,其中有1个控制器类型的寄存器,8个中断使能寄存器,8个中断失能寄存器,8个中断挂起设定/清除寄存器,8个中断有效位寄存器,60个中断优先级寄存器。而STCM4内核NVIC控制器寄存器做了一定缩减,其寄存器分布图如下:

    31.png 

        在中断编程时,我们一般使用ST提供的固件库,对中断配置在程序编写时我们一般就使用中断使能、中断失能、中断优先级设定三个寄存器。

    NVIC嵌套向量中断控制器里有一个用于管理中断优先级的寄存器NVIC_IPRx(x=0,1,20),其数据位宽度为8bit,如果8位全使用,则可配置的优先级为0-255,数值小的优先级越高,但在STM32F373中,只是使用了高4位,可配置的优先级为0-15

    4位又被分为抢占优先级和响应优先级。对这4位又有5种搭配方式,定义抢占优先级和响应优先级的位数,其分组由内核外设SCB模块的应用程序中断及复位控制寄存器AIRCRbit8-bit10(PRIGROUP[0:2])三位决定,分组可用下图所示:

    32.png 

    ST官方已经把设定优先级分组封装成了一个库函数,我们设置优先级分组时,可直接调用相关库函数即可,中断库函数可在官方库文件misc.cmisc.h中找到,其优先级分组设定函数如下图所示:

    33.png 

    如我们想设置0位响应优先级、4位抢占优先级即优先级分组0,其函数可写为:

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

    那我们仅仅是配置了优先级就够了吗?我们还需要配置通道,即配置中断源,按照前面中断向量表中的Position中断编号来查询即可配置即可。配置了中断源后,我们还需对中断源使能中断,ST官方把通道配置、优先级设定、通道使能定义为了一个结构体,其定义如下:

    34.png 

    下面我们以USART1为例,配置中断优先级分组为3,即3位响应优先级,1位抢占优先级,抢占优先级级数为0,响应优先级级数为1,对其编写程序如下:

    Void NVIC_Init(void)

    {

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);         //配置优先级分组

    NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;      //USART1中断通道

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为最高 0

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //响应优先级为 1

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //使能中断通道

    NVIC_Init(&NVIC_InitStructure);    //将结构体成员的值写入对应的寄存器

    }

     

    至此,中断篇讲解完毕,更多详细的NVIC的介绍,可查阅官方技术手册NVIC部分。


    收藏 0 回复 0 浏览 124
×
黄忠