嵌入式分享合集22

来来来 每天的嵌入式最近都在用go -纯tcp太烦人了 来把 看看c吧

一、嵌入式C语言2

用预处理指令 #define 声明一个常数,用以表明 1 年中有多少秒(忽略闰年问题):

#define  SECONDS_PER_YEAR  (60 * 60 * 24 * 365)UL
 

    写一个标准宏MIN,这个宏输入两个参数,并返回较小的一个:

#define  MIN(A,B) ((A) <= (B) ? (A):(B))

    预处理器标识 #error 的目的是什么:

#error : 停止编译 并显示 错误信息

    嵌入式系统中经常要用到无限循环,你怎么样用C语言编写死循环:

 

    用变量a给出下面的定义:

  • 整形数:int a;

  • 指向整型数的指针:int * a;

  • 指向指针的指针,它指向的指针指向整型数:int * * a;

  • 有10个整型数的数组:int a[10];

  • 有10个指针的数组,它的指针指向整型数:int * a[10];

  • 指向有10个整型数的数组的指针:int ( * a ) [ 10 ];

  • 指向函数的指针,该函数有一个整型参数,并返回一个整型数:int ( * a)(int);

    static的作用,请写出两个:

 

    关键字const的作用:

 

    另外使用const定义变量:

 

    volatile的作用:

    定义为volatile的变量可能会被意想不到地改变,优化器在用到这个变量时必须重新读取这个变量的值,而不是保存在寄存器里的备份。

    volatile变量的例子:

 

    嵌入式系统总是要用户对变量或寄存器,进行位操作:

 

    嵌入式系统经常具有要求程序员去访问某特定的内存位置,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66:

 

    中断的概念:

    当某个事件发生时,CPU 停止运行正在执行的程序,而转去执行处理该事件的程序,处理该事件后,返回原程序继续执行下去的过程。

    ISR:中断服务程序(Interrupt Service Routines)。

 

    下面代码输出的结果是什么?

 

    当表达式 中存在 有符号类型 和 无符号类型 时,所有的 操作数 都自动转换为 无符号类型,因此 -20 变成了一个非常大的正整数,该表达式计算出的结果 大于6,答案是输出 > 6。

    动态内存分配:

 

    typedef语句用于给基本数据类型和导出数据类型定义一个新的名字:

二、蜂鸣器驱动电路详解

蜂鸣器是电路设计中常用的器件,广泛用于工业控制报警、机房监控、门禁控制、计算机 等电子产品作预警发声器件,驱动电路也非常简单,然而很多人在设计时往往随意设计,导 致实际电路中蜂鸣器不发声、轻微发声和乱发声的情况发生。

    下面就 3.3V NPN 三极管驱动有源蜂鸣器设计,从实际产品中分析电路设计存在的问题,提出电路的改进方案,使读者能从小小的蜂鸣器电路中学会分析和改进电路的方法,从而设计出更优秀的产品,达到抛砖引玉的效果。whaosoft aiot http://143ai.com

常见错误接法

上图为典型的错误接法,当 BUZZER 端输入高电平时蜂鸣器不响或响声太小。当 I/O 口为高电平时,基极电压为 3.3/4.7*3.3V≈2.3V,由于三极管的压降 0.6~0.7V,则三极管射 极电压为 2.3-0.7=1.6V,驱动电压太低导致蜂鸣器无法驱动或者响声很小。

   上图为第二种典型的错误接法,由于上拉电阻R2,BUZZER 端在输出低电平时,由于 电阻R1和R2的分压作用,三极管不能可靠关断。

    上图为第三种错误接法,三极管的高电平门槛电压就只有 0.7V,即在 BUZZER 端输入 压只要超过0.7V就有可能使三极管导通,显然0.7V的门槛电压对于数字电路来说太低了, 电磁干扰的环境下,很容易造成蜂鸣器鸣叫。

 上图为第四种错误接法,当CPU的GPIO管脚存在内部下拉时,由于 I/O 口存在输入阻抗,也可能导致三极管不能可靠关断,而且和图3一样BUZZER端输入电压只要超过0.7V就有可能使三极管导通。

    以上几种用法我觉得也不能说是完全不行,对于器件的各种参数要求会比较局限,不利于器件选型,抗干扰性能也比较差。

NPN三极管控制有源蜂鸣器常规设计

上图为通用有源蜂鸣器的驱动电路。电阻R1为限流电阻,防止流过基极电流过大损坏三极管。关于三极管基础,请移步此文:PNP与NPN两种三极管使用方法

    电阻R2有着重要的作用。

    第一个作用:R2 相当于基极的下拉电阻。如果A端被悬空则由于R2的存在能够使三极管保持在可靠的关断状态,如果删除R2则当BUZZER输入端悬空时则易受到干扰而可能导致三极管状态发生意外翻转或进入不期望的放大状态,造成蜂鸣器意外发声。

    第二个作用:R2可提升高电平的门槛电压。如果删除R2,则三极管的高电平门槛电压就只有0.7V,即A端输入电压只要超过0.7V 就有可能导通,添加R2的情况就不同了,当从A端输入电压达到约2.2V 时三极管才会饱和导通,具体计算过程如下:

    假定β =120为晶体管参数的最小值,蜂鸣器导通电流是15mA。那么集电极电流IC=15mA。则三极管刚刚达到饱和导通时的基极电流是 IB=15mA/120=0.125mA。流经R2的电流是0.7V/3.3kΩ=0.212mA,流经R1的电流 IR1=0.212mA +0.125mA=0.337 mA。最后算出BUZZER端的门槛电压是0.7V+0.337mA× 4.7kΩ=2.2839V≈2.3V。

    图中的C2为电源滤波电容,滤除电源高频杂波。C1可以在有强干扰环境下,有效的滤除干扰信号,避免蜂鸣器变音和意外发声,在 RFID射频通讯、Mifare卡的应用时,这里初步选用0.1uF 的电容,具体可以根据实际情况选择。

改进方案

    蜂鸣器竟然有EMI 辐射?!在 NPN 3.3V 控制有源蜂鸣器时,在电路的 BUZZER 输入 高电平,让蜂鸣器鸣叫,检测蜂鸣器输入管脚(NPN 三极管的C极处信号,发现蜂鸣器在发声时,向外发生1.87KHz,-2.91V 的脉冲信号,蜂鸣器自身发放脉冲如下图所示。

  在电路的BUZZER 输入20Hz的脉冲信号,让蜂鸣器鸣叫,检测蜂鸣器输入管脚处信号,发现蜂鸣器在发声时,在控制电平上叠加了1.87KHz,-2.92V 的脉冲信号,并且在蜂鸣器关断时出现正向尖峰脉冲(≥10V),如下图所示。

 

上图中1.87KHz,-2.92V 的脉冲信号应该是有源蜂鸣器内部震荡源释放出来的信号。常用有源蜂鸣器主要分为压电式、 电磁震荡式两种, iMX283 开发板上用的是压电式蜂鸣器,压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成,而多谐震荡器由晶体管或集成电路构成,我们所用的蜂鸣器内部含有晶体管震荡电路(有兴趣的朋友可以自己拆开看看)。

    有源蜂鸣器产生脉冲信号能量不是很强,可以考虑增加滤波电容将脉冲信号滤除。在有源蜂鸣器的两端添加一个104的滤波电容,脉冲信号削减到-110mV,减少蜂鸣器自身发放脉冲如下图所示,但顶部信号由于电容充电过慢,有点延时。

   消除蜂鸣器EMI辐射,NPN 有源蜂鸣器控制电路改善后电路图如下所示。

 

兼容性设计

    作为标准电路,需要考虑电路的兼容性问题,比如同样耐压不同功率的有源蜂鸣器,有 源蜂鸣器和无源蜂鸣器的兼容性问题。

兼容同样耐压不同功率的有源蜂鸣器电路设计

    为了电路的兼容性和可扩展性,电路需要考虑兼容不同厂家和不同功率的蜂鸣器。同一 个耐压的蜂鸣器主要是蜂鸣器的内阻和工作电流不一样,一般 3V~5V 耐压的蜂鸣器,不同功率的蜂鸣器导通电流是 10mA~80mA。我们按照最大功率的蜂鸣器去设计电路即可,即三极管的推动电流按照 80 mA 设计。

    假定:β=120 为晶体管参数的最小值,蜂鸣器导通电流是 80 mA。那么集电极电流 IC =80 mA。则三极管刚刚达到饱和导通时的基极电流 IB=80mA/ 120=0.667mA。流经 R2的电流是 0.7V/ 3.3kΩ= 0.212mA,所以流经 R1 的电流应该是 IR1=0.667mA +0.125mA=0.792mA。BUZZER 端的门槛电压是设定在 2.2V,那么 R1=(2.2V-0.7V)/ 0.792mA=1.89K。电阻取常规 2K 即可。

    如果电路更换功率稍大一点的有源蜂鸣器,可以按照上面的计算方法计算 R1 的大小。

兼容有源蜂鸣器和无源蜂鸣器电路设计

    在电路的设计过程中,往往会碰到需求变更,比如项目前期,对蜂鸣器的发声频率没有 要求,但后期有要求,需要更换为无源蜂鸣器,这时就需要修改电路图,甚至修改 PCB, 这样就增加了改动成本、周期和风险。

    有源蜂鸣器和无源蜂鸣器的驱动电路区别主要在于无源蜂鸣器本质上是一个感性元件, 其电流不能瞬变,因此必须有一个续流二极管提供续流。否则,在蜂鸣器两端会有反向感应 电动势,产生几十伏的尖峰电压,可能损坏驱动三极管,并干扰整个电路系统的其它部分。而如果电路中工作电压较大,要使用耐压值较大的二极管,而如果电路工作频率高,则要选 用高速的二极管。这里选择的是 IN4148 的开关二极管。NPN 无源蜂鸣器控制电路图如下所示。

 

三、菊厂体脂秤拆解

这块菊厂体脂秤诞生于2016年有些年头了,通过拆解发现,内部线路结构比较简单,主控和测脂芯片均来自一家深圳企业,同时搭配了四颗高精度压力传感器。

    之前发过的类似文章:拆解体脂秤,学习其内部电路

产品外观

    外观采用大面积超白钢化玻璃面板,用隐藏式的ITO电镀膜完成人体阻抗测量,取代市面上普遍的金属电极片方案。不仅提升了产品设计美观度,而且用户不必再要求站在指定的电极位置上,测量更自由简单。

    隐藏式LED显示屏效果,不必担心破坏秤面设计美感,在偏暗的环境下数值仍然清晰可读。

    体脂秤需要4节AAA(七号)电池供电,底部三个小孔是蜂鸣器的出声孔,装上电池后蜂鸣器响起即表示开机。

    秤脚采用可活动的“万向式”设计,即便地面有轻微水平差异,也可以更好地过滤掉秤面倾斜造成的测量误差;大秤脚+磨砂设计科学分布中心防滑防侧翻。

    最大可支撑150kg的体重,胖子也能放心使用,不必担心踩坏。

    菊厂商城官网上的一些参数信息,交流测试,频率50KHz;主控IC是一款MCU+蓝牙的集成芯片。

内部拆解

    接下来我们进入重要的拆解环节。

    体脂秤的秤体采用卡扣对应进行固定,拆下几颗螺丝钉后,用塑料撬片沿着缝隙划开上下盖板的塑料卡扣即可拆开。

    上盖板(即玻璃秤面一侧)完成核心元器件设计,如图左侧所示。

    四角的位置分别为四颗高精度压力传感器。

    下盖板采用ABS塑料材质,上下塑料盖板内部均使用了大量加强筋做强化处理。

    点式传感器测量精度更高。

    电路主板,表面涂有明显的防潮油,右上角集成蓝牙天线。

    主控IC采用芯海科技的CST34M97集成了称重、蓝牙、LED显示驱动等功能。

    据悉为秤领域首颗双核蓝牙SOC体脂秤专用芯片,双核CPU架构,称重测脂与蓝牙通讯独立运行。

    主控的右下侧是一颗FLASH芯片,型号为FT25H04S,容量4MB。

    测脂IC同样是来自于芯海科技的产品CS1256,采用四电极+正弦波激励的BIA生物电阻抗分析技术。延庆川北小区45孙老师 收卖废品破烂垃圾炒股 废品孙 再回收

    将主板拆下来,LED显示屏一侧,如图所示可以显示四位数字、蓝牙、百分比以及单位等符号。揭开表层,可以看到盖板下方共有35颗LED。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值