嵌入式开发
文章平均质量分 68
老李的森林
老李,自由职业,主要工作是方案设计,定制开发,包括机械设计(UG),电路设计(Altium),嵌入式开发(STM32,MSP430,软硬件开发),电脑端软件开发(Python,Delphi)。主要工作方向是3D打印机设计,自动化设备的开发,PLC相关控制系统的开发,并联机器人的设计开发。我的手木几:要山酒酒陆要其山舞儿其
展开
-
嵌入式开发--STM32用HAL库硬件I2C读取MPU6050的数据
MPU6050是一款6轴传感器,可检测3轴位移和3轴加速度,MCU可通过I2C接口操作。注意接口线需要上拉电阻,一般为10K,在距离远或干扰强的场合,可降低通讯速率,和适当减小电阻值,比如4.7K。原创 2024-10-21 08:45:00 · 1251 阅读 · 0 评论 -
嵌入式开发--STM32G030C8T6,写片上FLASH死机CFGBSY和写入出错
G0系列,写片上FLASH时,经常死机,而且按复位键都没用,属于不断电都救不回来的那种死法。这种情况一般是由硬件置位了某个标志导致,只有断电才能故障复原。原创 2024-08-16 14:56:22 · 674 阅读 · 0 评论 -
嵌入式开发--Altium获得布线长度
在PCB布线时,有可能需要知道某一段线的长度。AltiumDesigner就提供了这个功能。红框处就是该网络的布线长度,下面还有其他相关信息,列出了节点名称,以及每一段的长度等。嵌入式开发–AltiumDesigner获得布线长度。需要按下图打开这个设置,视图–>面板–>PCB。然后点击左下角的PCB选项卡,以调出PCB界面。原创 2023-03-13 09:00:00 · 889 阅读 · 0 评论 -
嵌入式开发--无刷电机学习2--克拉克变换
首先说明,有很多方法,在数学上是等价的,比如3+3+3+3=3*4=12。下面说的事情也是。为了更简明的控制,克拉克女士提出电机控制简化的方法,即建立一个坐标系,横轴是α 纵轴是β,并将三相电流在这个坐标轴上投影,用两个正交分布的投影代替。并描述二者之间的关系,从而得出任意时刻的iα和iβ。其物理意义是用两个正交分布的线圈(分别放在α轴和β轴上),去模拟三相电机120度分布的三个线圈。这二者在数学上是等价的。如此可以简化控制流程。在实际驱动电机的时候,只需要求一个逆解即可驱动电机。原创 2023-05-01 08:30:00 · 3752 阅读 · 0 评论 -
嵌入式开发--XW09A触摸芯片的使用
XW09A是厦门市芯网电子科技有限公司出品的一颗触摸芯片,支持9键多点触摸,I2C接口,带中断引脚。以下摘抄自芯片手册极高的灵敏度,可穿透13mm 的玻璃,感应到手指的触摸超强的抗干扰和ESD 能力,不加任何器件即可通过人体8000v 实验外围电路简单,最少只需一个4.7nf 电容,芯片即可正常工作外围寄生电容自动校正工作电压范围:2.5 ~ 5.5 VSOP16 环保封装。原创 2023-07-08 10:25:18 · 1327 阅读 · 7 评论 -
嵌入式开发--CubeMX最新版本6.9.0的问题
刚刚将CubeMX升级到最新版本,发现一个问题,他会将你自己在Keil中所添加的支持包等等一系列操作全部删除,变成一个空工程的状态。但是,如果在CubeMX中再次生成工程,就会变成下图的状态。如下,是我做好相关设置后的KEIL工程截图。以前的版本从来没有出现这种问题。原创 2023-07-25 09:49:02 · 800 阅读 · 2 评论 -
嵌入式开发:ST-LINK V2.1仿真器,Type-C接口
之前做的版本虽然也是V2.1的,但使用的接口是USB的Micro形式,不支持正反插,也不兼容现在通用的手机数据线,出差的时候又要多带一条线。现在终于把我的ST-LINK的接口改了一下如下图自带信仰加持,神灵保佑一遍调通。主芯片是STM32F103CBT6,很好买。具体的调试和使用,见我之前的另一篇文章,里面讲的很详细,这次仅仅是更新了硬件接口,其他的都没有变化。原创 2023-11-10 15:05:43 · 868 阅读 · 0 评论 -
嵌入式开发--赛普拉斯cypress的铁电存储器FM25CL64B
FM25CL64B是赛普拉斯cypress出品的一款铁电存储器,这种存储器最大的优势是可以像RAM一样随机存储,和按字节写入,也可以像ROM一样掉电仍然可以保存数据,是一种相当优秀的新型存储器,但是容量不能做得很大,只适合保存一些重要数据。重要参数及解读如下:64K位,即8K字节100T的读写次数,这意味着即使对于同一单元,每毫秒读取或写入一次,也需要3170年才能消耗完这个次数,而我们对存储器的访问几乎不可能达到这样的频率,也不可能只访问一个数据单元,所以它的读写次数寿命虽然有限,但可以不在考原创 2023-11-19 17:07:15 · 1594 阅读 · 0 评论 -
嵌入式开发--STM32G4系列片上FLASH的读写
写完烧录开始调试,发现问题了,有时能写入,有时不能写入。先找了正点原子的例程来做参考,他的可以写入,但原子的例程是操作寄存器进行读写的,不直观,移植性也不好,个人还是喜欢用HAL库的方式来做东西,于是作罢。然后又找了ST的例程来看,刚好手上有一块G4的开发板,于是编译,报错,可能是我的开发环境比较新,与ST官方的编译环境不同,又是一通折腾,编译通过,但一加载调试,就卡死不动。于是新建工程,再把ST的例程移植到我的工程中,编译通过,可以调试,还是有时能写有时不能写。又回到了起点。原创 2024-01-17 17:28:11 · 2927 阅读 · 5 评论 -
嵌入式开发--Keil MDK仿真时System Viewer不显示寄存器选项
可我的工程如下图,在View下拉菜单中的System Viewer内,不显示寄存器选项。原创 2024-02-20 09:39:44 · 1443 阅读 · 0 评论 -
嵌入式开发--STM32的GPIO输入和输出复用
MCU的引脚数量非常有限,做项目时,经常是为了成本而选择引脚尽量少的芯片,这也给布线和编程带来更大的挑战。最近一个项目,需要在某些时候通过拨码开关预置参数,预置完成后,在正式工作时,该引脚又处于输出状态,驱动很多的其他设备。这时,使用IO引脚扩展是一个办法,但是会增加成本,还有一个更好的办法,就是引脚的输入和输出复用。简单的说,就是在上电时将目标引脚设置为输入状态,以读取拨码开关的状态。设置完成后,拨码开关复位,再将引脚设置为输出状态即可。原创 2024-08-13 11:17:45 · 506 阅读 · 0 评论 -
嵌入式开发--获取STM32产品系列的信息
有时候我们需要知道当前MCU是STM32的哪一个系列,这当然可以从外部丝印看出来,但是运行在内部的软件如何知道呢?ST为我们提供了一个接口,F1和G4系列地址统一为:0xE004 2000,需要以32位方式读取。H7系列的地址是0x10006450对于F1系列,该说明如下:对于G4系列,说明如下:例如我读取的内容如下图,对应的就是再去查看后面蓝色标识的表格如下:是属于第2类设备,容量是128KB但如果读出来的是第3类设备呢,有那么多型号。原创 2024-03-21 15:52:33 · 721 阅读 · 0 评论 -
嵌入式开发--STM32用DMA+IDLE中断方式串口接收不定长数据
IDLE顾名思义,就是空闲的意思,即当监测到串口空闲超过1个串口的数据帧时,会使状态寄存器(SR或ISR)的IDLE位置位,如果此时控制寄存器(CR或CR1)的IDLEIE为1,则会触发IDLE中断。DMA搬运数据,则是一边接收数据,一边将串口接收到的数据搬运到内存中,这个过程不需要MCU参与,等到IDLE中断到来的时候,直接去内存中取数据即可。DMA中断在CubeMX中是默认开启的,可以手动将其关闭,等IDLE中断到来的时候,直接操作读取数据即可。原创 2023-07-17 08:25:37 · 1884 阅读 · 0 评论 -
嵌入式开发--无刷电机学习4--SVPWM
这张图是基于α和β坐标系,也就是定子磁场坐标系,图中的Uout就是定子磁场的空间矢量,它的角度表示定子线圈产生磁场的方向,长度表示磁场的强度,以电机匀速旋转为例,FOC控制的目标就是让这个矢量的长度保持不变,角度匀速变化。图上以60度为间隔,划分了6个区,其意义类似于6步换向,也就是在不同的区域,相应的开启或关闭相应的驱动桥的上下臂,以及上下臂的导通时间,来实现的。原创 2023-05-02 17:32:38 · 1290 阅读 · 0 评论 -
嵌入式开发--无刷电机学习3--帕克变换
前面说到克拉克变换的物理意义,是将三相定子线圈产生磁场的过程,等效为2个正交放置的线圈,来产生同样的磁场。通过控制这两个正交线圈即可等效控制三相定子线圈。还有一个问题,定子线圈产生的磁场,如果与转子位置不匹配就成了开环控制了,显然我们需要与转子的位置对应起来控制,这个过程也叫闭环控制。也就是不断的读取转子的位置,并根据这个位置,实时的给出当前所需要驱动磁场方向和强度。定子磁场坐标是一定的,也就是我们之前说到的定子坐标系,和Ia-Iβ坐标系。而转子的磁场是一直在旋转,这个叫转子坐标系。原创 2023-05-02 07:47:27 · 2556 阅读 · 0 评论 -
嵌入式开发--STM32片上外设--独立看门狗IWDG
嵌入式开发–STM32片上外设–独立看门狗IWDG。说白话就是单片机可能因为干扰造成工作异常,或软件编写问题错误造成程序跑飞,比如本来应该在程序区取指令,结果由于指针异常,跑到数据区去取指令。或者反过来。可想而知程序执行会有意料不到的后果。于是我们设置一个硬件机制,必须在固定的时间间隔内,对某种硬件电路发送信号,如果超过这个时间间隔,该硬件电路会将单片机复位,使得程序重新执行。如此增加了系统的可靠性。这个硬件机制就叫看门狗。发送信号叫喂狗。一旦超时狗会叫,单片机会复位。原创 2023-04-09 16:17:26 · 914 阅读 · 0 评论 -
嵌入式开发--CAN总线与高速光耦6N137
CAN总线应用时,有时候需要加光耦隔离电路,以免在雷击或遇到高压干扰时,保护设备安全。常用的有光耦隔离和专用芯片隔离。本文介绍使用高速光耦6N137的光耦隔离方案。6N137是10MBPS的高速光耦,而CAN总线的最高速度仅为1MBPS,用在此处绰绰有余。6N137等效电路如下:1,4脚空闲,2,3脚是输入侧,接发光二极管5脚接地6脚输出7脚为使能端8脚接电源。原创 2023-03-21 16:11:39 · 5534 阅读 · 22 评论 -
嵌入式开发--STM32H750VBT6开发中,新版本CubeMX的时钟问题,不能设置到最高速度480MHZ
之前开发的项目,开发环境是CubeMX6.6.1,H7系列的支持包版本是1.10.0。跑得没问题,最近需要对项目做修改,同时我的CubeMX也已经升级到最新的6.7.0,H7系列支持包版本升级到最新的1.11.0。在CubeMX中做了一些修改以后,发现时钟不对了,无法将主时钟频率设置为480M,软件提示D1CPRE时钟要小于200M,如下图:如果将上图箭头处的D1CPRE改为240M,则会出现下图的报错,软件提示DIVP1的时钟不能大于300MHZ,原创 2023-03-01 16:24:41 · 3916 阅读 · 13 评论 -
嵌入式开发--PID控制
讲解PID的文章书籍很多,本文就不详细讲了,只讲一下我在学习过程中不容易理解的一些问题点,以供大家参考。比如很多书籍对于PID,只讲了计算,但是最后计算出来的值如何应用,则完全不讲,当时我是一头雾水,后来搞明白以后又觉得还是很简单的,但如果书籍里面能提一下,那不是让人学习起来容易很多么。PID就是比例,积分,微分三个单词的首字母缩写,是工程上控制系统中的一个常用控制算法。以下结合我之前做过的一个温度控制的项目来介绍PID。用的是当时保留下来的一些调试图片,供参考。PID有两种控制方式,增量式和位置式,二原创 2022-12-26 09:00:00 · 1856 阅读 · 1 评论 -
嵌入式开发-STM32硬件SPI驱动TFT屏
现在的TFT屏幕已经很便宜了,65536色屏幕,2.8英寸,分辨率320X240的液晶屏才20元,我为了图省事,多配了一个转接板12元,共32元包邮到家,真是香。上面这个是这次用到的2.8寸TFT屏幕(20元),下面的是0.96寸OLED屏(10元),可见尺寸的巨大差别。当然OLED屏的优势是省电,在手持设备上是首选。这个屏幕是SPI接口,最少4线驱动,分别是MOSI数据,CLK时钟,CS片选,DC数据/指令切换,还有2根线可选,是RESET和背光,复位可以用电阻电容上电时拉一下跳变即可,背光可以一直接原创 2022-12-12 09:00:00 · 4210 阅读 · 0 评论 -
嵌入式开发--RS-485通讯的问题
RS-485一般简称485总线,是最常用的工业总线之一,一般采用2线的半双工模式,用差分方式收发信息。最高速度可达10M BPS。单片机使用485总线时,是用UART或USART接口,通过RS-485收发器完成信号的输入和输出。常用的芯片有MAX485,MAX3485,SP3485等等。硬件很简单,RO和DI连接到单片机的UART接口,是数据的收发引脚,RE和DE连通,接到单片机的GPIO,以控制数据流的方向,是输入还是输出。连接到UART2,具体设置如下:这些参数需要根据你的设置要求进行,异步模式原创 2022-12-06 19:59:28 · 3168 阅读 · 0 评论 -
嵌入式开发--STM32硬件SPI驱动74HC595
本篇是硬件SPI口驱动74HC595。原创 2022-12-05 09:00:00 · 4654 阅读 · 7 评论 -
嵌入式开发--Altium技巧:原理图设置和布线前的检查
在工程上点右键,并在弹出的菜单上选择最后一项:Project Options,即项目设置。弹出如下界面,如果操作不当,设置错了,可以点击左下的按键,设置成安装缺省,恢复默认设置。2 Floating net labels 未接入的网络,如下图PB0。可以双击Message窗口中的每一项报告,如第1个,就违背了上面的第4条规则,如下图。这几个都是极其重要的错误,一旦忽略,就会造成打版后的错误。Altium的默认设置,有一些是很不合理的选项,强烈建议大家修改。设置好以后按确定键,以保存。原创 2022-11-29 11:30:05 · 762 阅读 · 0 评论 -
STM32开发时HardFault错误的排查
本篇是一文的扩展。把相关的问题记录一下,给遇到HardFault_Handler问题的朋友做个参考。原创 2022-11-21 14:52:07 · 2101 阅读 · 0 评论 -
C语言保留指定位数的小数
嵌入式开发中,经常会遇到C语言要保留指定位数的小数的问题,在此做个记录,免得每次用到都要折腾一通。原创 2022-11-17 14:52:23 · 14499 阅读 · 0 评论 -
嵌入式开发-STM32硬件I2C驱动OLED屏
坊间流传STM32的硬件I2C很容易死机,所以不能使用硬件I2C,正点原子也在教程中强调了这一点。个人猜想由于Philips拥有专利,而ST为了绕开专利,而将硬件I2C弄得异常复杂(从相关的寄存器数量及设置可见一斑),造成硬件I2C很是难用,也容易出现异常死机。今天我就来挑战一下。尝试使用STM32F103C8T6用硬件I2C的方式来驱动OLED屏。原创 2022-11-07 11:47:42 · 8212 阅读 · 2 评论 -
嵌入式开发--CubeMX使用入门教程
传统的单片机开发时,需要针对片上外设做各种初始化的工作,相当麻烦。CubeMX是ST公司出品的一款图形化代码生成工具,通过图形化界面,可以非常直观的配置好各种片上外设,时钟,中断,DMA等等各种设备的参数,然后CubeMX可以直接生成初始化代码,使得开发人员可以将更多的精力放在核心代码的开发上。生成的代码选择性适配IAR,KEIL,以及ST自家的STM32CubeIDE(免费)原创 2022-10-25 20:10:35 · 20023 阅读 · 2 评论 -
电路设计基础--MOS管驱动直流电机电路,看懂芯片手册
第1页一般是芯片的简要介绍,会说明芯片性能,关键参数,封装,以利于工程师的快速选型。原创 2022-10-15 15:54:24 · 8524 阅读 · 0 评论 -
电路设计基础--三极管驱动直流电机电路
直流电机,即通上直流电,就可以旋转的电动机。由于电机的线圈绕组会频繁的换向,换向碳刷或铜片与线圈接触处会有火花,这种电机工作起来会有较大的电磁干扰,对电源来说,也会带来尖峰毛刺。原创 2022-10-06 14:36:06 · 9818 阅读 · 5 评论 -
电路设计基础--光耦接口电路的设计和参数选取--高速光耦TLP109
光耦常用于电气隔离,以免外部进来的信号中混有高压,大电流等脉冲,烧坏我们自己的电路或芯片。比如422,485,CAN,或室外的可能遇到雷击的各种传感器和线路,与设备连接时,通常都会用到光耦。光耦比较简单,外围电路也不多,最简单的光耦外部电路只有2,3个电阻,但这2,3个电阻的取值却是有讲究的,很多工程师不明所以,随便抄一个电路,虽然大概率也能用,但往往都不能让芯片工作在正确的状态下。虽然只是2个电阻值的选取,但对于电子工程师来说,吃透电路原理是非常重要的,如果参数选择不合适,轻则无法工作,重则工作不可靠。原创 2022-10-05 16:38:18 · 9106 阅读 · 0 评论 -
电容式触摸按键功能的实现
现在有很多设备都实现的触摸功能。相比于原先的按键开关,由于没有机械动作,所以它的寿命更长,轻触即可实现按键的功能。具体的实现方式,是检测一个金属片的对地电容量,当这个电容量突然发生变化时,即可认为有了触摸行为。许多芯片还有自校准功能,可以消除环境变化导致电容量检测偏差。原创 2022-09-30 18:40:05 · 2462 阅读 · 0 评论 -
STM32无硬件随机数发生器时生成随机数的方法
对于有RNG功能的MCU,直接调用相关的函数即可,很简单HAL_RNG_GetRandomNumber 获得随机数。原创 2022-09-13 17:45:46 · 2390 阅读 · 0 评论 -
STM32驱动2位数码管
一般我们用的数码管是8位的,其实就是在一个模块中集成了8个LED,分别显示笔划,如下图电路原理如下,若是将所有LED的N极连接到一起,叫共阴,若是将P连接到一起,叫共阳。我用红字标出了每个笔划对应的定义。2位数码管,就是有2个8段的显示,并把它们集成到了一起,其abcdefg和dp脚都连到了一起,2个公共端分别表示左边和右边的选择。......原创 2022-08-27 19:14:48 · 7372 阅读 · 5 评论 -
6轴并联机器人示教器
6轴并联机器人示教器开发中,先演示一下各个硬件功能模块。示教器用来调试机器人的动作和姿态,并可以记录若干个分组,每个分组存储一组示教数据。机器人支持 8路输入和8路输出信号,以支持输入的传感器以及控制信号,和输出的动作执行器如气缸,电磁阀,继电器等。原创 2022-08-22 11:33:00 · 654 阅读 · 0 评论 -
stm32以中断方式扫描矩阵键盘
普通的按键,都是一个IO口控制一个按键,但是当按键数量变多时,单片机可能没有那么多的IO口来供给按键使用,这时候就需要用到矩阵键盘,比如4。定义一个结构体,有按键触发时,active置1,x,y分别记录行列值,num是最后的键值。4 在Y4中断内,将Y4配置为低电平输出,而X0~3配置为上拉输入,记录下Y值为4。X0到X3这4个IO口配置为低电平输出,无上拉,无下拉,即推挽方式,速度为中。5 逐一检测X0~3的电平,哪一路为低,即对应的为X键值,本例X值为2。最后调用键盘扫描函数,来确认X的键值。.....原创 2022-08-09 17:11:30 · 4313 阅读 · 1 评论 -
stm32 用定时器的编码器模式来检测正反转
编码器常用来检测电机的正反转,也有做成旋钮的形式,用于人机交互界面,二者原理都是一样的,本例以旋钮编码器为演示:AB两相,分别输出方波,编码器正向旋转时,A相比B相超前90度,反相旋转时,A相比B相滞后90度。通过检测二者的相位差,即可得知电机的旋转方向。通过检测脉宽,可以知道电机的转速。stm32系列单片机的定时器提供了编码器模式,可以检测编码器的旋转方向,以及脉冲数。...原创 2022-08-09 14:59:23 · 5100 阅读 · 2 评论 -
嵌入式开发--IO口扩展--74HC595
嵌入式开发–IO口扩展,输出引脚嵌入式开发经常遇到IO口不够的情况,更换引脚更多的单片机是一种选择,但最近两年单片机的价格翻着跟斗的往上涨,替代方便也有,就是通过IO口扩展芯片来实现。本段说明摘自明微电子的说明书:74HC595D 是一种具有8 位锁存、8 位串行输入、 8 位串/并行输出、 串—并移位寄存器和三态输出功能的通用LED 驱动芯片。具有8 位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器是分别的时钟。数据在SCK 的上升沿输入,在RCK 的上升沿进入的存储寄存器中去。移位寄存原创 2022-05-21 16:45:21 · 5227 阅读 · 0 评论 -
6轴并联机器人的拖动示教功能
6轴并联机器人的拖动示教功能,人工操作操作一次,机器人重复千万次,省去大量人工重复作业,机器替代人工是未来的趋势,机器人的开发已接近尾声,未来可期。#6轴并联机器人 #6轴机器人 #并联机器人 6轴并联机器人的拖动示教功能,人工操作一 ...原创 2022-05-20 11:06:52 · 941 阅读 · 0 评论 -
Keil MDK 5.36安装及和谐
Keil MDK 5.36安装及和谐官网下载KEIL MDK5 5.36版本安装软件和谐踩坑指南官网下载KEIL MDK5 5.36版本下载地址:https://www.keil.com/demo/eval/arm.htm,输入基本信息即可免费下载最新版本。我是喜欢用比较新的版本,但不会用最新的,怕出问题当了小白鼠。一般来说新版本会改进一些老版本中存在的bug,当然也会放入若干新bug _。主要是新版本会增加一些新的功能。安装软件安装路径默认就好,但是要注意不能有中文,否则即使软件安装成功,原创 2022-05-10 18:11:28 · 19308 阅读 · 9 评论 -
嵌入式开发--Altuim Designer生成的PCB文件过大,及其他日常技巧
Altuim Designer生成的PCB文件过大一般我们画图,不同的设计,生成的文件在几百K到几M之间。但是,如果一个简单的设计,其PCB文件也占用几M甚至几十M,那就不正常了,大概率是包含了中文字体。如果PCB上的印刷字体,包含了中文,那么在默认情况下是会将整个中文字库包含进PCB文件的,解决方法也很简单,如下图,不要勾选这个选项就行了。为了使中文在PCB板厂也能正常丝印出来,建议在设计的时候不要选择不常用的中文字体,用最平常的黑体就可以了。有些朋友可能不知道如何在PCB上显示中文,看到的都原创 2022-05-04 15:09:20 · 1975 阅读 · 2 评论