单片机程序烧录的3种方式ISP-ICP-IAP是什么
说起给单片机烧录程序,大家应该都不陌生吧,我最早接触单片机是从51单片机开始的,型号是STC89C52RC,当时烧录程序就是用的下面这种烧录软件——STC-ISP。
这种方式,通过串口连接单片机,选择一个合适的波特率就可以烧录了。
后来学习STM32,编程时使用KEIL软件自带的下载按钮就能下载程序,方便了不少,但需要额外使用J-Link等下载器。
再后来,接触到产品研发,给已经发布出的产品升级,都是要靠远程无线升级的(想想看,产品已经到客户那里了,当软件需要升级时,要是还使用有线的方式烧录程序,得有多麻烦)
既然给单片机烧录程序的方式有多种,那烧录方式具体怎么分类呢?
可以分为3种:
ISP(In-System Programming)
在系统编程,使用引导程序(Bootloader)加上外围UART/SPI等接口进行烧录。
ICP (In-circuit programmer)
在电路编程,使用SWD/JTAG接口。
IAP(In-Application Programming)
指MCU可以在系统中获取新代码并对自己重新编程,即用程序来改变程序。
这3种烧录方式的 ...
介绍一款好玩且开源的机器人仿真软件Webots
Webots简介Webots是一个开源的多平台机器人仿真软件,由Cyberbotics公司开发,为机器人的建模、编程和仿真提供了完整的开发环境。Webots在2018年以前是一款商业软件,之后Webots进行了开源(自2018年12月起,Webots作为开放源码软件在Apache 2.0许可下发布)。
Webots内核基于开源动力学引擎ODE和OpenGL,可以在Windows、Linux和macOS上运行,并且支持多种编程语言(C/C++,Python,Java,MATLAB)。
Webots安装Webots官方下载:http://www.cyberbotics.com/
Webots可以在Windows、Linux、MacOS上都能安装,简单起见,现在Windows上进行安装。
(官网下载安装包可能比较慢,公众号后台回复“webots”获取云盘下载链接)
安装过程很简单,一路next即可。
Webots初体验Webots的界面如下:
Webots提供了许多示例,通过这些例子我们能很快了解到Webots的功能。
nao机器人
6足机器人
避障机器人
激光雷达 ...
cJSON基础介绍与代码测试
JSON是什么JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。
JSON 基本语法
数据以 key :value (名称/值) 的形式存在
数据由逗号 , 分隔
大括号 {} 保存对象
中括号 [] 保存数组,数组可以包含多个对象
例如:
1{ name : C Primer pluse, pages : 626 }
JSON值(value)的类型12345678/* cJSON Types: */#define cJSON_False 0#define cJSON_True 1#define cJSON_NULL 2#define cJSON_Number 3#define cJSON_String 4#define cJSON_Array 5#define cJSON_Object 6
逻辑值(true 或 false)
1{"flag":true}
n ...
电机控制基础--定时器编码器模式使用与转速计算
上篇介绍了定时器捕获输入脉冲的原理(),那种方式是根据捕获的原理,手动切换上升沿与下降沿捕获,计算脉冲宽度的过程原理比较清晰,但编程操作起来比较麻烦。
对于电机测速用到的正交编码器,测速时需要捕获2路脉冲,如果使用上一篇介绍的方法,编程就较为复杂。还好单片机的通用定时器具有专门的正交编码器接口,只需配置相应的寄存器,就可实现编码器输入的上下沿自动捕获与计数,非常便于编码器的测速。
下面就来介绍下定时器的编码器模式的使用:
1 正反转计数原理示例编码器模式下,计数器的计数方向代表的电机的正转与反转,计数的大小代表了转速的大小。
如下图,电机正转时,编码器的通道A(TI1)的信号超前通道B,计数器向上计数,反转时,通道A的信号滞后,向下计数。
设置信号的极性反相,可以使向下计数代表电机正转。
2 定时器编码器模式配置以STM32 芯片为例,其内部有专门用来采集增量式编码器方波信号的接口,这些接口实际上是STM32 定时器的其中一种功能。不过编码器接口功能只有高级定时器TIM1、TIM8 和通用定时器的TIM2~TIM5 才有。
正交编码器有两路正交的输入信号(关于正交编码的介绍,可 ...
电机控制基础--定时器捕获单输入脉冲原理
上篇介绍了定时器的输出功能,本篇介绍定时器的输入功能。
1 问题引出在单片机与嵌入式开发中,某些场景需要捕获传感器的高电平(或低电平)信号的持续时间,如红外解码信号、编码器输入信号等。
如下图,以单一的一段高电平输入信号为例,如何测量这段高电平的时间呢?
从直观上理解,就是要不断的检测这个信号,当信号从0变到1时,记录一个时间,再从1变到0时,记录另一个时间,两个时间差就是高电平的持续时间了。那具体要怎么编程呢?这就要用到定时器了。
2 定时器的捕获原理上篇介绍了定时器的输出功能,本篇是利用定时器的输入功能,来计算脉冲时长。如下图:
定时器的CNT计数器在不停的计数
首先配置定时器的输入通道为上升沿捕获,这样当检测到从0到1的跳变时,CCR1就会先保存当前的CNT值,同时CNT会清零重新开始计数
然后将定时器的输入通道为下降沿捕获,当检测从1到0的跳变时,CCR2就会先保存当前的CNT值
在这期间,CNT的计数值可能会溢出,这不影响,记录下溢出的次数,并重新开始计数即可
最终,t2-t1的高电平时间,就可以通过N次的溢出时间加CCR2保存的时间来计算获得了
3 定时器常用的 ...
电机控制基础--定时器基础知识与PWM输出原理
单片机开发中,电机的控制与定时器有着密不可分的关系,无论是直流电机,步进电机还是舵机,都会用到定时器,比如最常用的有刷直流电机,会使用定时器产生PWM波来调节转速,通过定时器的正交编码器接口来测量转速等。
本篇先介绍定时器的基础知识,然后对照这些知识介绍一下定时器输出PWM的基本原理,以及编程实现与代码分析。
首先来看一下定时器的基础介绍。
1 定时器基础知识1.1 定时器种类以STM32F4为例,一共有14个定时器:
高级定时器(TIM1、TIM8)
通用定时器(TIM2TIM5,TIM9TIM14)
TIM2~TIM5(通用定时器里功能较多的)
TIM9/TIM12
TIM10/TIM11和TIM13/TIM14
基本定时器 (TIM6、TIM7)
1.2 各种定时器的特性1.2.1 高级定时器与通用定时器这里列举高级定时器的特性,在此基础上,对比添加其与通用定时器的不同之处:
16 位递增、递减、递增/递减自动重载计数器(TIM2 和 TIM5为32位)
16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 到 65536 ...
编码器计数原理与电机测速原理--多图解析
编码器,是一种用来测量机械旋转或位移的传感器。它能够测量机械部件在旋转或直线运动时的位移位置或速度等信息,并将其转换成一系列电信号。
编码器分类按监测原理分类光电编码器光电编码器,是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。这是目前应用最多的传感器,光电编码器是由光源、光码盘和光敏元件组成。
光栅盘是在一定直径的圆板上等分地开通若干个长方形孔。由于光电码盘与电动机同轴,电动机旋转时,光栅盘与电动机同速旋转,经发光二极管等电子元件组成的检测装置检测输出若干脉冲信号,通过计算每秒光电编码器输出脉冲的个数就能反映当前电动机的转速。
此外,为判断旋转方向,码盘还可提供相位相差90°的两路脉冲信号。
霍尔编码器霍尔编码器是一种通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。
霍尔编码器是由霍尔码盘(磁环)和霍尔元件组成。
霍尔码盘是在一定直径的圆板上等分地布置有不同的磁极。霍尔码盘与电动机同轴,电动机旋转时,霍尔元件检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号。
按输出信号分类增量式编码器增量式编码器是将设备运动时的 ...
Win10下的java开发环境配置--JDK下载安装与测试
测试环境:
Win10
JDK-11.0.10
下载安装包进入官网,点击Java SE Download,Jave SE是Java Standard Edition(Java标准版)的缩写
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
点进去之后,往下拉,找到 Java SE 11(LTS),这时一个被长期支持的稳定版(Long Time Support),然后点击 JDK Download。
JDK为Java SE Development Kit(Java 标准版开发包)的缩写
点进去之后,往下拉,找到Windows版的安装包,有exe和zip两种,选择exe的安装方式,下载即可。
下载时会弹出要先注册登录的界面,注册登录之后就可以下载了。
下载过程可能比较慢,我这里下载好了,可以从我的云盘下载()。
安装JDK双击安装
下一步
![]https://xxpcb-1259761082.cos.ap-shanghai.myqcloud.com/pic/java/in ...
FreeRTOS设计模式借鉴--设计一个滑动平均滤波器
之前的几篇文章对FreeRTOS的部分源码进行了分析,可以发现FreeRTOS对于任务、事件标志组、消息队列等的实现都是通过控制块的方式来操作。
比如任务()有任务控制块TCB_t,
事件标志组()有事件控制块EventGroup_t,
消息队列()有消息队列控制块Queue_t,
软件定时器()有软件定时器控制块Timer_t。
使用它们前都是先创建(内存分配资源),返回一个控制块的句柄,之后就可以通过句柄来操作这个对象了。
基本原理以FreeRTOS的这种机制为参考,我们可以模仿着实现一个简单的滤波器,可以用于对传感器的原始数据进行滤波。
先来分析一下基本原理:
设定我们的滑动平均滤波器的窗口宽度为5,可以使用一个数组来实现
使用一个index来指示下次数据将要存放在数组中的位置
初始状态,滤波器数组都是0,index指向数组的起始位置
开始阶段
原始数据依次存入滤波器数组,这时的滤波器输出有两种选择:
方式1:既然数组还未存满,就先不输出滤波结果
方式2:虽然数组还未存满,但可以计算已经存入的这几个数的平均值作为滤波输出
这两种方式只在初始阶段存在差别,本文后续编码 ...
FreeRTOS源码探析之--消息队列
消息队列
1 消息队列基础1.1 消息队列的运作机制创建消息队列时FreeRTOS会先给消息队列分配一块内存空间,这块内存的大小等于消息队列控制块大小加上(单个消息空间大小与消息队列长度的乘积),接着再初始化消息队列,此时消息队列为空。
任务或者中断服务程序都可以给消息队列发送消息,当发送消息时:
如果队列未满或者允许覆盖入队,FreeRTOS会将消息拷贝到消息队列队尾
否则(队列已满),会根据用户指定的阻塞超时时间进行阻塞,在这段时间中,如果队列一直不允许入队,该任务将保持阻塞状态以等待队列允许入队。
当其它任务从其等待的队列中读取入了数据(队列未满),该任务将自动由阻塞态转换为就绪态。
当等待的时间超过了指定的阻塞时间,即使队列中还不允许入队,任务也会自动从阻塞态转移为就绪态,此时发送消息的任务或者中断程序会收到一个错误码errQUEUE_FULL。
发送紧急消息的过程与发送消息几乎一样,唯一的不同是,当发送紧急消息时,发送的位置是消息队列队头而非队尾,这样,接收者就能够优先接收到紧急消息,从而及时进行消息处理。
1.2 消息队列的阻塞机制我们使用的消息队列一般不是属于 ...