技术
学过单片机的同学,对PWM应该不陌生,一般学习单片机的第二个例程就是用PWM技术调节占空比来控制LED亮度。然而PWM控制技术在逆变电路中应用最广,正是有赖于其在逆变电路中的应用,才确定了它在电力电子技术中的重要地位。因此,本文将详细阐述pwm的原理:PWM(PulseWidthModulation)控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。
PWM控制技术在逆变电路中应用最广,应用的逆变电路绝大部分是PWM型,PWM控制技术正是有赖于在逆变电路中的应用,才确定了它在电力电子技术中的重要地位。
<strong> 1、PWM控制的基本原理</strong>
理论基础:
影响单片机系统可靠安全运行的主要因素主要来自系统内部和外部的各种电气干扰,并受系统结构设计、元器件选择、安装、制造工艺影响。这些都构成单片机系统的干扰因素,常会导致单片机系统运行失常,轻则影响产品质量和产量,重则会导致事故,造成重大经济损失。
<strong>形成干扰的基本要素有三个:</strong>
<strong>(1)干扰源。</strong>指产生干扰的元件、设备或信号, 用数学语言描述如下:du/dt, di/dt大的地方就是干扰源。如:雷电、继电器、可控硅、电机、高频时钟等都可能成为干扰源。
<strong>(2)传播路径。</strong>指干扰从干扰源传播到敏感器件的通路或媒介。典型的干扰传播路径是通过导线的传导和空间的辐射。
在单片机开发中,由于资源受限而没有平台的支持,每次开发都要重写很多代码,应用的千奇百怪的需求更是加剧了这种困难。解决问题的办法是,总结常见的需求,分析它,得出即高效有通用的解决方案。
今天我就来为大家提供一种按键的解决方案,它易用,高效,节省资源!
先给出这个按键模块解决方案的全部代码,稍后再来分析。
<strong> keyif.h内容:</strong>
Cortex-M4微控制器(MCU)将可加速马达控制设计。精准的马达控制须仰赖精密且复杂的算法才能达到,而Cortex-M4微控制器运算能力达100MHz,并具备DSP及硬件浮点运算单元,可有效执行马达控制所需的高阶计算,有助减轻开发负担。
透过内建Cortex-M4核心的微控制器(MCU),再搭配智能型连接的接口设备,将可轻松执行复杂的马达控制算法。本文将以永磁同步马达(PMSM)磁场定向控制(FOC)之中的方程式为例进行探讨,并显示如何利用CMSIS数字信号处理器(DSP)链接库进行处理。本范例使用的相同原则,可应用至其他控制算法及马达类型。此外,也将探讨智能型接口设备为何不需要第二个核心,并说明使用单一业界标准核心搭配CMSIS DSP链接库的众多优点。
对于一个新设计的电路板,调试起来往往会遇到一些困难,特别是当板比较大、元件比较多时,往往无从下手。但如果掌握好一套合理的调试方法,调试起来将会事半功倍。对于刚拿回来的新PCB板,我们首先要大概观察一下,板上是否存在问题,例如是否有明显的裂痕,有无短路、开路等现象。如果有必要的话,可以检查一下电源跟地线之间的电阻是否足够大。
作者:阮一峰
源码要运行,必须先转成二进制的机器码。这是编译器的任务。
比如,下面这段源码(假定文件名叫做test.c)。
#include <stdio.h>int main(void){
fputs("Hello, world!\n", stdout);
return 0;}
要先用编译器处理一下,才能运行。
$ gcc test.c
$ ./a.out
Hello, world!
对于复杂的项目,编译过程还必须分成三步。
$ ./configure
$ make
$ make install
<strong>一:C语言程序的存储区域</strong>
由C语言代码(文本文件)形成可执行程序(二进制文件),需要经过编译-汇编-连接三个阶段。编译过程把C语言文本文件生成汇编程序,汇编过程把汇编程序形成二进制机器代码,连接过程则将各个源文件生成的二进制机器代码文件组合成一个文件。
C语言编写的程序经过编译-连接后,将形成一个统一文件,它由几个部分组成。在程序运行时又会产生其他几个部分,各个部分代表了不同的存储区域:
1、代码段(Code或Text)
代码段由程序中执行的机器代码组成。在C语言中,程序语句进行编译后,形成机器代码。在执行程序的过程中,CPU的程序计数器指向代码段的每一条机器代码,并由处理器依次运行。
2、只读数据段(RO data)
作者:linuxer
<strong>一、前言</strong>
本文主要描述了ARM64启动过程中,如何建立初始化阶段页表的过程。我们知道,从bootloader到kernel的时候,MMU是off的(顺带的负作用是无法打开data cache),为了提高性能,加快初始化速度,我们必须某个阶段(越早越好)打开MMU和cache,而在此之前,我们必须要设定好页表。
<strong> 1、快速排序算法</strong>
快速排序是由东尼•霍尔所发展的一种排序算法。在平均状况下,排序n个项目要Ο(nlogn)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(nlogn)算法更快,因为它的内部循环(innerloop)可以在大部分的架构上很有效率地被实现出来。
快速排序使用分治法(Divideandconquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
算法步骤:
(1)从数列中挑出一个元素,称为“基准”(pivot),
<strong> 3、标识符</strong>
a、变量的命名
方法一:采用匈牙利命名法。命名规则的主要思想是“在变量中加入前缀以增进人们对程序的理解”。
例如平时声明32位整型变量Length对应使用匈牙利命名法为unLength。现在列出经常用到的变量类型。
变量类型 示例
char cLength
unsigned char ucLength
short int sLength
编程的总则:编程首要是要考虑程序的可行性,然后是可读性、可移植性、健壮性以及可测试性。大多数程序员只是关注程序的可行性,而忽略了可读性,可移植性和健壮性,其实我个人认为,程序的可行性和健壮性与程序的可读性有很大的关系,能写出可读性很好的程序的程序员,他写的程序的可行性和健壮性必然不会差,也会有不错的可移植性。程序的可读性需要程序员有一个良好的编程风格。
好风格应该成为一种习惯。如果你在开始写代码时就关心风格问题,如果你花时间去审视和改进它,你将会逐渐养成一种好的编程习惯。一旦这种习惯变成自动的东西,你的潜意识就会帮你照料许多细节问题,甚至你在工作压力下写出的代码也会更好。
<strong>1、排版</strong>
这篇文章是俄国人Sergei P.Skorobogatov就读英吉利剑桥大学之博士论文,讲解了各种MCU的攻防技术,堪称一部小百科全书。对于志在研究MCU防护的筒子,能给你很多参考思路:但对于想当黑客的人,我们对后果概不负责!
C非侵入式攻击不需要对元器件进行初始化。攻击时可以把元器件放在测试电路中分析,也可单独连接元器件。一旦成功,这种攻击很容易普及,并且重新进行攻击不 需要很大的开销。另外,使用这种攻击不会留下痕迹。因此,这被认为是对任意元器件的硬件安全最大的威胁。同时,通常需要很多时间和精力来寻找对特定元器件 的非侵入式攻击方法。这通常对元器件进行反向工程,包括反汇编软件和理解硬件版图。
ARM支持7种异常。问题时发生了异常后ARM是如何响应的呢?下面一起来学习一下:
所有的系统引导程序前面中会有一段类似的代码,如下:
<center><img src="http://mm32.eetrend.com/files/2016-09/wen_zhang_/100002849-9339-8ecbff5…; alt=""></center>
作者:ce123
<strong>IICvs SPI</strong>
现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是这两种通信协议非常适合近距离低速芯片间通信。Philips(for IIC)和Motorola(for SPI) 出于不同背景和市场需求制定了这两种标准通信协议。
常把单片机系统的复位分为冷启动和热启动。所谓冷启动,也就是一般所说的上电复位,冷启动后片内外RAM的内容是随机的,通常是0x00或0xFF;单片机的热启动是通过外部电路给运行中的单片机的复位端一复位电平而实现的,也就是所说的按键复位或看门狗复位。复位后,RAM的内容都没有改变。在某些场合,必须区分出设备的重启是热重启还是冷重启。常用的方法是:确定某内存单位为标志位(如0x40003FF4~0x40003FF7 RAM单元),启动时首先读该内存单元的内容,如果它等于一个特定的值(例如为0xAA55AA55),就认为是热启动,否则就是冷启动。
根据以上的设计思路思路定义一个变量:
uint32 unStartFlag;
在程序启动时判断:
if(unStartFlag==0xAA55AA55)
{
最近写一个程序,需要在用户模式下关中断,但ARM 7的体系结构决定了中断必须在特权模式下才可以更改,所以想到使用ARM的软中断来实现关中断和开中断。
使用软中断,首先要有硬件指令的支持,ARM有条指令是SWI。
SWI 指令的格式为:
SWI {条件} 24 位的立即数
SWI 指令用于产生软件中断,以便用户程序能调用操作系统的系统例程。操作系统在 SWI 的异常处理程序中提供相应的系统服务,指令中 24 位的立即数指定用户程序调用系统例程的类型,相关参数通过通用寄存器传递,当指令中 24 位的立即数被忽略时,用户程序调用系统例程的类型由通用寄存器 R0 的内容决定,同时,参数通过其他通用寄存器传递。
指令示例:
SWI 0x02 ;该指令调用操作系统编号位02的系统例程。
各种事物都有套路,开关电源的套路就是各种拓扑。对这些拓扑了然于胸,就能看清开关电源的本质。
为了表征各种电压或电流波形的好坏,一般都是拿电压或电流的幅值、平均值、有效值、一次谐波等参量互相进行比较。在开关电源之中,电压或电流的幅值和平均值最直观,因此,我们用电压或电流的幅值与其平均值之比,称为脉动系数S;也有人用电压或电流的有效值与其平均值之比,称为波形系数K。
因此,电压和电流的脉动系数Sv、Si以及波形系数Kv、Ki分别表示为:
Sv=Up/Ua——电压脉动系数
Si =Im/Ia——电流脉动系数
Kv=Ud/Ua——电压波形系数
Ki=Id/Ia——电流波形系数
<strong>1、单片机的工作频率</strong>
<strong>1.1 单片机的设计应根据客户的需求来选择较低的工作频率</strong>
首先介绍一下这样做的优点:采用低的晶振和总线频率使得我们可以选择较小的单片机满足时序的要求,这样单片机的工作电流可以变得更低,最重要的是VDD到VSS的电流峰值会更小。
当然我们这里需要做一个妥协,因为客户的要求可能是兼容的和平台化的(目前汽车电子的发展趋势就是平台化),选择较高的工作频率可以兼容更多的平台,也方便以后升级和扩展,因此要选择一个较低的可以接受的工作频率。
<strong>2、恰当的输出驱动能力</strong>
<strong>1、前言</strong>
在软件开发的过程中,debug(调试)是一个很重要的事情,因为没有百分之百正确的代码,一旦结果不符合预期,我们需要知道问题出在哪里了。
在PC环境下开发应用程序,我们不需要太操心,因为有各式各样的模拟器、调试器可供使用,我们可以追踪到每一行代码的执行过程和执行结果,找出问题只是时间问题而已。但在嵌入式环境下,就有些麻烦了,能用的手段,无外乎两种:
1)使用硬件仿真器定位问题。
2)使用日志输出定位问题。
对嵌入式工程师(特别是linux工程师)而言,鉴于使用硬件仿真器的诸多不便(成本高,无法保证人手一个;硬件连接复杂,需要预留特定接口;使用不方便;等等),日志输出几乎成为必备且唯一的debug手段。但是,总会有例外:
<strong>1、static关键字</strong>
这个关键字前面也有提到,它的作用是强大的。
要对static关键字深入了解,首先需要掌握标准C程序的组成。
标准C程序一直由下列部分组成:
1)正文段——CPU执行的机器指令部分,也就是你的程序。一个程序只有一个副本;只读,这是为了防止程序由于意外事故而修改自身指令;
2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。
3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。
注意:只有全局变量被分配到数据段中。