单片机

单片机主要作用是控制外围的器件,并实现一定的通信和数据处理。但在某些特定场合,不可避免地要用到数学运算,尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机实现数字滤波。

在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号会现无规则的变化而无法预测,但多次测量的结果符合统计规律。为克服随机干扰引起的误差,硬件上可采用滤波技术,软件上可采用软件算法实现数字滤波。滤波算法往往是系统测控算法的一个重要组成部分,实时性很强。

采用数字滤波算法克服随机干扰的误差具有以下优点:

1、数字滤波无需其他的硬件成本,只用一个计算过程,可靠性高,不存在阻抗匹配问题。尤其是数字滤波可以对频率很低的信号进行滤波,这是模拟滤波器做不到的。

2、数字滤波使用软件算法实现,多输入通道可共用一个滤波程序,降低系统开支。

3、只要适当改变滤波器的滤波程序或运算,就能方便地改变其滤波特性,这对于滤除低频干扰和随机信号会有较大的效果。

4、在单片机系统中常用的滤波算法有限幅滤波法、中值滤波法、算术平均滤波法、加权平均滤波法、滑动平均滤波等。

(1)限幅滤波算法

该运算的过程中将两次相邻的采样相减,求出其增量,然后将增量的绝对值,与两次采样允许的最大差值A进行比较。A的大小由被测对象的具体情况而定,如果小于或等于允许的最大差值,则本次采样有效;否则取上次采样值作为本次数据的样本。

算法的程序代码如下:

#defineA //允许的最大差值
chardata; //上一次的数据
char filter()
{
chardatanew; //新数据变量
datanew=get_data(); //获得新数据变量
if((datanew-data)>A||(data-datanew>A))
return data;
else
returndatanew;
}

说明:限幅滤波法主要用于处理变化较为缓慢的数据,如温度、物体的位置等。使用时,关键要选取合适的门限制A。通常这可由经验数据获得,必要时可通过实验得到。

(2)中值滤波算法

该运算的过程是对某一参数连续采样N次(N一般为奇数),然后把N次采样的值按从小到大排列,再取中间值作为本次采样值,整个过程实际上是一个序列排序的过程。

算法的程序代码如下:
#define N11 //定义获得的数据个数
char filter()
{
charvalue_buff[N]; //定义存储数据的数组
char count,i,j,temp;
for(count=0;count
{
value_buf[count]=get_data();
delay(); //如果采集数据比较慢,那么就需要延时或中断
}
for(j=0;j
{
for(value_buff[i]>value_buff[i+1]
{
temp=value_buff[i];
value_buff[i]=value_buff[i+1];
value_buff[i+1]=temp;
}
}
returnvalue_buff[(N-1)/2];
}

说明:中值滤波比较适用于去掉由偶然因素引起的波动和采样器不稳定而引起的脉动干扰。若被测量值变化比较慢,采用中值滤波法效果会比较好,但如果数据变化比较快,则不宜采用此方法。

(3)算术平均滤波算法

该算法的基本原理很简单,就是连续取N次采样值后进行算术平均。
算法的程序代码如下:
char filter()
{
int sum=0;
for(count=0;count
{
sum+=get_data();
delay():
}
return (char)(sum/N);
}

说明:算术平均滤波算法适用于对具有随机干扰的信号进行滤波。这种信号的特点是有一个平均值,信号在某一数值附近上下波动。信号的平均平滑程度完全到决于N值。当N较大时,平滑度高,灵敏度低;当N较小时,平滑度低,但灵敏度高。为了方便求平均值,N一般取4、8、16、32之类的2的整数幂,以便在程序中用移位操作来代替除法。

(4)加权平均滤波算法

由于前面所说的“算术平均滤波算法”存在平滑度和灵敏度之间的矛盾。为了协调平滑度和灵敏度之间的关系,可采用加权平均滤波。它的原理是对连续N次采样值分别乘上不同的加权系数之后再求累加,加权系数一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的认识。各个加权系数均小于1的小数,且满足总和等于1的结束条件。这样加权运算之后的累加和即为有效采样值。其中加权平均数字滤波的数学模型是:

式中:D为N个采样值的加权平均值:XN-i为第N-i次采样值;N为采样次数;Ci为加权系数。加权系数Ci体现了各种采样值在平均值中所占的比例。一般来说采样次数越靠后,取的比例越大,这样可增加新采样在平均值中所占的比重。加权平均值滤波法可突出一部分信号抵制另一部分信号,以提高采样值变化的灵敏度。

样例程序代码如下:

char codejq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; //code数组为加权系数表,存在程序存储区
char codesum_jq=1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
{
char count;
char value_buff[N];
int sum=0;
for(count=0;count
{
value_buff[count]=get_data();
delay();
}
for(count=0;count
sum+=value_buff[count]*jq[count];
return(char)(sum/sum_jq);
}

(5)滑动平均滤波算法

以上介绍和各种平均滤波算法有一个共同点,即每获取一个有效采样值必须连续进行若干次采样,当采速度慢时,系统的实时得不到保证。这里介绍的滑动平均滤波算法只采样一次,将一次采样值和过去的若干次采样值一起求平均,得到的有效采样值即可投入使用。如果取N个采样值求平均,存储区中必须开辟N个数据的暂存区。每新采集一个数据便存入暂存区中,同时去掉一个最老数据,保存这N个数据始终是最新更新的数据。采用环型队列结构可以方便地实现这种数据存放方式。

程序代码如下:
char value_buff[N];
char i=0;
char filter()
{
char count;
int sum=0;
value_buff[i++]=get_data();
if(i==N)
i=0;
for(count=0;count
sum=value_buff[count];
return (char)(sum/N);
}

(6)低通滤波

将普通硬件RC低通滤波器的微分方程用差分方程来表求,变可以采用软件算法来模拟硬件滤波的功能,经推导,低通滤波算法如下:

Yn=a* Xn+(1-a) *Yn-1
式中 Xn——本次采样值
Yn-1——上次的滤波输出值;
,a——滤波系数,其值通常远小于1;
Yn——本次滤波的输出值。

由上式可以看出,本次滤波的输出值主要取决于上次滤波的输出值(注意不是上次的采样值,这和加权平均滤波是有本质区别的),本次采样值对滤波输出的贡献是比较小的,但多少有些修正作用,这种算法便模拟了具体有教大惯性的低通滤波器功能。滤波算法的截止频率可用以下式计算:

fL=a/2Pit pi为圆周率3.14…
式中 a——滤波系数;
, t——采样间隔时间;
例如:当t=0.5s(即每秒2次),a=1/32时;
fL=(1/32)/(2*3.14*0.5)=0.01Hz

当目标参数为变化很慢的物理量时,这是很有效的。另外一方面,它不能滤除高于1/2采样频率的干搅信号,本例中采样频率为2Hz,故对1Hz以上的干搅信号应采用其他方式滤除,

低通滤波算法程序于加权平均滤波相似,但加权系数只有两个:a和1-a。为计算方便,a取一整数,1-a用256-a,来代替,计算结果舍去最低字节即可,因为只有两项,a和1-a,均以立即数的形式编入程序中,不另外设表格。虽然采样值为单元字节(8位A/D)。为保证运算精度,滤波输出值用双字节表示,其中一个字节整数,一字节小数,否则有可能因为每次舍去尾数而使输出不会变化。
设Yn-1存放在30H(整数)和31H(小数)两单元中,Yn存放在32H(整数)和33H(小数)中。滤波程序如下:副表6.

今天就写到这,因为数字滤波的算法还有很多种方法,比如一阶滞后低通滤波器(惯性滤波法),限时滤波,容错冗余三中取二滤波法等等。不过由于个人能力和时间的原因,还没能把它们一一地列出。以后我会不断地找资料把它们完善。

来源:玩转单片机

围观 295

看过标题,可能很多朋友都会冒出很多疑问:单片机?单片机不是电子设计的心脏吗?它的心脏又是什么?

你知道单片机的“心脏”是怎么工作的吗?

无论是单片机还是微处理器,它们的核心都是大规模的时序逻辑电路,而驱动时序逻辑电路的动力则是准确而稳定的时钟源——不要小看定语“准确而稳定”哦,实际上人类的科技之所以能如此稳定、高速的发展,就是离不开准确而稳定的时钟源。比如单片机所使用的晶体振荡器,就是一种比较准确的时钟源。

在晶体振荡器之前,振荡源一般是LC振荡电路等电路,但它们会受到外界的影响(振动、温度等),其误差可能达到kHz级别。长时间的工作情况下其准确度也难以保证。无线电和数字电路的发展迫使一种准确且稳定的时钟源诞生,于是就有了晶体振荡器。

将石英晶体按照一定的方式切割,并向其施加电压,它就会在外加电场的作用下开始振动,这种性质被称作“压电性”。这就使得石英晶体拥有了能够与外界的振荡谐振的能力。按照同样的方式切割出来的晶体拥有着相同的振荡频率,这也就使得批量生产石英晶体成为了可能。

你知道单片机的“心脏”是怎么工作的吗?

实用的石英晶体振荡器的内部一般是这样的:一片精密切割好的晶体放置在中间,被两片化学处理过的金属氧化物夹在中间,并用结实的金属外壳包装好。这也是为什么晶振的电路图符号是一两个电极夹着一个晶体。典型的石英晶体振荡器的应用电路如下图所示:

你知道单片机的“心脏”是怎么工作的吗?

这种电路被称作皮尔斯振荡器,利用一个反相器来完成电路。下方的两个电容一般取相同的电容值,它们的取值可以微弱的影响整个电路的振荡频率。它们的作用是与石英晶体构成带通滤波器,在石英晶体的共振频率上形成一个180度的相移。这个电路最常见于单片机的时钟部分。

对于石英晶体来说,被切割的越细,其共振频率越高——但也不是无极限的,切割的过细的话,石英晶体将很容易破碎。而这个极限频率大概为20MHz。那那些20MHz以上的晶体是怎么制作的呢?

你知道单片机的“心脏”是怎么工作的吗?

实际上,对于超过20MHz的晶体,它们所利用的是晶体振荡频率中的谐波。我们可以加强晶体的奇数倍谐波并利用它。比如我想要使用50MHz的晶体的话,我可以制造一块10MHz的晶体,并使它的结构增强5倍谐波(50MHz)。对于这样的晶体来说,如果需要纯净的50MHz的话,在使用时就需要使用外接的谐振电路选择出这个50MHz的谐波。

你知道单片机的“心脏”是怎么工作的吗?

对于时钟源这种东西来说,我们永远不会介意它的精度高,越高越好。但是即使是晶振这种有很长历史的振荡器,也足够我们好好研究上一段时间了呢!

来源:至秦单片机

围观 453

通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动,如图 8-10 所示。

单片机按键消抖程序

图 8-10 按键抖动状态图

按键稳定闭合时间长短是由操作人员决定的,通常都会在 100ms 以上,刻意快速按的话能达到 40-50ms 左右,很难再低了。抖动时间是由按键的机械特性决定的,一般都会在 10ms以内,为了确保程序对按键的一次闭合或者一次断开只响应一次,必须进行按键的消抖处理。当检测到按键状态变化时,不是立即去响应动作,而是先等待闭合或断开稳定后再进行处理。按键消抖可分为硬件消抖和软件消抖。

硬件消抖就是在按键上并联一个电容,如图 8-11 所示,利用电容的充放电特性来对抖动过程中产生的电压毛刺进行平滑处理,从而实现消抖。但实际应用中,这种方式的效果往往不是很好,而且还增加了成本和电路复杂度,所以实际中使用的并不多。

单片机按键消抖程序

图 8-11 硬件电容消抖

在绝大多数情况下,我们是用软件即程序来实现消抖的。最简单的消抖原理,就是当检测到按键状态变化后,先等待一个 10ms 左右的延时时间,让抖动消失后再进行一次按键状态检测,如果与刚才检测到的状态相同,就可以确认按键已经稳定的动作了。将上一个的程序稍加改动,得到新的带消抖功能的程序如下。

#include

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit KEY3 = P2^6;
sbit KEY4 = P2^7;

unsigned char code LedChar[] = { //数码管显示字符转换表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};

void delay();
void main(){
bit keybuf = 1; //按键值暂存,临时保存按键的扫描值
bit backup = 1; //按键值备份,保存前一次的扫描值
unsigned char cnt = 0; //按键计数,记录按键按下的次数

ENLED = 0; //选择数码管 DS1 进行显示
ADDR3 = 1;
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0;
P2 = 0xF7; //P2.3 置 0,即 KeyOut1 输出低电平
P0 = LedChar[cnt]; //显示按键次数初值

while (1){
keybuf = KEY4; //把当前扫描值暂存
if (keybuf != backup){ //当前值与前次值不相等说明此时按键有动作
delay(); //延时大约 10ms
if (keybuf == KEY4){ //判断扫描值有没有发生改变,即按键抖动
if (backup == 0){ //如果前次值为 0,则说明当前是弹起动作
cnt++; //按键次数+1
//只用 1 个数码管显示,所以加到 10 就清零重新开始
if (cnt >= 10){
cnt = 0;
}
P0 = LedChar[cnt]; //计数值显示到数码管上
}
backup = keybuf; //更新备份为当前值,以备进行下次比较
}
}
}
}
/* 软件延时函数,延时约 10ms */
void delay(){
unsigned int i = 1000;
while (i--);
}
大家把这个程序下载到板子上再进行试验试试,按一下按键而数字加了多次的问题是不是就这样解决了?把问题解决掉的感觉是不是很爽呢?

这个程序用了一个简单的算法实现了按键的消抖。作为这种很简单的演示程序,我们可以这样来写,但是实际做项目开发的时候,程序量往往很大,各种状态值也很多, while(1)这个主循环要不停的扫描各种状态值是否有发生变化,及时的进行任务调度,如果程序中间加了这种 delay 延时操作后,很可能某一事件发生了,但是我们程序还在进行 delay 延时操作中,当这个事件发生完了,程序还在 delay 操作中,当我们 delay 完事再去检查的时候,已经晚了,已经检测不到那个事件了。为了避免这种情况的发生,我们要尽量缩短 while(1)循环一次所用的时间,而需要进行长时间延时的操作,必须想其它的办法来处理。

那么消抖操作所需要的延时该怎么处理呢?其实除了这种简单的延时,我们还有更优异的方法来处理按键抖动问题。举个例子:我们启用一个定时中断,每 2ms 进一次中断,扫描一次按键状态并且存储起来,连续扫描 8 次后,看看这连续 8 次的按键状态是否是一致的。8 次按键的时间大概是 16ms,这 16ms 内如果按键状态一直保持一致,那就可以确定现在按键处于稳定的阶段,而非处于抖动的阶段,如图 8-12。

单片机按键消抖程序

图 8-12 按键连续扫描判断

假如左边时间是起始 0 时刻,每经过 2ms 左移一次,每移动一次,判断当前连续的 8 次按键状态是不是全 1 或者全 0,如果是全 1 则判定为弹起,如果是全 0 则判定为按下,如果0 和 1 交错,就认为是抖动,不做任何判定。想一下,这样是不是比简单的延时更加可靠?

利用这种方法,就可以避免通过延时消抖占用单片机执行时间,而是转化成了一种按键状态判定而非按键过程判定,我们只对当前按键的连续 16ms 的 8 次状态进行判断,而不再关心它在这 16ms 内都做了什么事情,那么下面就按照这种思路用程序实现出来,同样只以K4 为例。

#include

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit KEY3 = P2^6;
sbit KEY4 = P2^7;

unsigned char code LedChar[] = { //数码管显示字符转换表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
bit KeySta = 1; //当前按键状态

void main(){
bit backup = 1; //按键值备份,保存前一次的扫描值
unsigned char cnt = 0; //按键计数,记录按键按下的次数
EA = 1; //使能总中断
ENLED = 0; //选择数码管 DS1 进行显示
ADDR3 = 1;
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0;
TMOD = 0x01; //设置 T0 为模式 1
TH0 = 0xF8; //为 T0 赋初值 0xF8CD,定时 2ms
TL0 = 0xCD;
ET0 = 1; //使能 T0 中断
TR0 = 1; //启动 T0
P2 = 0xF7; //P2.3 置 0,即 KeyOut1 输出低电平
P0 = LedChar[cnt]; //显示按键次数初值

while (1){
//****************KeySta = KEY4; //把当前扫描值暂存
if (KeySta != backup){ //当前值与前次值不相等说明此时按键有动作
if (backup == 0){ //如果前次值为 0,则说明当前是弹起动作
cnt++; //按键次数+1
if (cnt >= 10){ //只用 1 个数码管显示,所以加到 10 就清零重新开始
cnt = 0;
}
P0 = LedChar[cnt]; //计数值显示到数码管上
}
//更新备份为当前值,以备进行下次比较
backup = KeySta;
}
}
}
/* T0 中断服务函数,用于按键状态的扫描并消抖 */
void InterruptTimer0() interrupt 1{
//扫描缓冲区,保存一段时间内的扫描值
static unsigned char keybuf = 0xFF;

TH0 = 0xF8; //重新加载初值
TL0 = 0xCD;
//缓冲区左移一位,并将当前扫描值移入最低位
keybuf = (keybuf<<1) | KEY4;
//连续 8 次扫描值都为 0,即 16ms 内都只检测到按下状态时,可认为按键已按下
if (keybuf == 0x00){
KeySta = 0;
//连续 8 次扫描值都为 1,即 16ms 内都只检测到弹起状态时,可认为按键已弹起
}else if (keybuf == 0xFF){
KeySta = 1;
}
else{
//其它情况则说明按键状态尚未稳定,则不对 KeySta 变量值进行更新
}
}
这个算法是我们在实际工程中经常使用按键所总结的一个比较好的方法,介绍给大家,今后都可以用这种方法消抖了。当然,按键消抖也还有其它的方法,程序实现更是多种多样,大家也可以再多考虑下其它的算法,拓展下思路。

围观 506

我要问的不是如何制作烧写接口。 而是,电脑在通过接口向单片机烧写时(此时单片机 内没有程序),电脑是如何通过接口访问内部rom的??对应p口怎么就会指向单片机内部rom(就像单片机是一个rom?

有三种方式:
1、把单片机当做一个ROM芯片,早期的单片机都是如此。将单片机放在通用编程上编程时,就像给28C256这样的ROM中写程序的过程一样。只是不同的单片机使用的端口,编程用的时序不一样。

2、像AT89S52或AVR单片机一样,在单片机上有SPI接口,这时用专用的下载线将程序烧写到单片机中。这时不同的是,单片机的CPU除了执行单片机本身的指令之外,还能执行对ROM进行操作的特殊指令,如ROM擦除、烧写和校验指令。在编程ROM时,下载线先通过传输这些指令给CPU执行(擦除ROM、读入数据、烧写ROM、和校验ROM),这样完成对单片机的ROM的烧写。此外,现在普遍使用的JTAG仿真器也是这样,单片机的CPU能执行JTAG的特殊指令,完成对ROM的烧写操作。

3、引导程序,即单片机中已经存在了一个烧写程序。启动单片机时首先运行这程序,程序判断端口状态,如果符合“要烧写ROM”的状态存在,就从某个端口(串口、SPI等等)读取数据,然后写入到单片机的ROM中。如果没有“要烧写ROM”的状态,就转到用户的程序开始执行。像AVR单片机的bootloader方式、STC的串口下载方式,还有其他单片机的串口编程等等都是这样。

来源:电子工程专辑

围观 359

PWM 在单片机中的应用是非常广泛的,它的基本原理很简单,但往往应用于不同场合上意义也不完全一样,这里我先把基本概念和基本原理给大家介绍一下,后边遇到用的时候起码知道是个什么东西。

PWM 是 Pulse Width Modulation 的缩写,它的中文名字是脉冲宽度调制,一种说法是它利用微处理器的数字输出来对模拟电路进行控制的一种有效的技术,其实就是使用数字信号达到一个模拟信号的效果。这是个什么概念呢?我们一步步来介绍。

首先从它的名字来看,脉冲宽度调制,就是改变脉冲宽度来实现不同的效果。我们先来看三组不同的脉冲信号,如图 10-1 所示。

单片机中PWM的原理与控制程序

图 10-1 PWM 波形

这是一个周期是 10ms,即频率是 100Hz 的波形,但是每个周期内,高低电平脉冲宽度各不相同,这就是 PWM 的本质。在这里大家要记住一个概念,叫做“占空比”。占空比是指高电平的时间占整个周期的比例。比如第一部分波形的占空比是 40%,第二部分波形占空比是 60%,第三部分波形占空比是 80%,这就是 PWM 的解释。

那为何它能对模拟电路进行控制呢?大家想一想,我们数字电路里,只有 0 和 1 两种状态,比如我们第 2 章学会的点亮 LED 小灯那个程序,当我们写一个 LED = 0;小灯就会长亮,当我们写一个 LED = 1;小灯就会灭掉。当我们让小灯亮和灭间隔运行的时候,小灯是闪烁。

如果我们把这个间隔不断的减小,减小到我们的肉眼分辨不出来,也就是 100Hz 以上的频率,这个时候小灯表现出来的现象就是既保持亮的状态,但亮度又没有 LED = 0;时的亮度高。那我们不断改变时间参数,让 LED = 0;的时间大于或者小于 LED = 1;的时间,会发现亮度都不一样,这就是模拟电路的感觉了,不再是纯粹的 0 和 1,还有亮度不断变化。大家会发现,如果我们用 100Hz 的信号,如图 10-1 所示,假如高电平熄灭小灯,低电平点亮小灯的话,第一部分波形熄灭 4ms,点亮 6ms,亮度最高,第二部分熄灭 6ms,点亮 4ms,亮度次之,第三部分熄灭 8ms,点亮 2ms,亮度最低。那么用程序验证一下我们的理论,我们用定时器T0 定时改变 P0.0 的输出来实现 PWM,与纯定时不同的是,这里我们每周期内都要重载两次定时器初值,即用两个不同的初值来控制高低电平的不同持续时间。为了使亮度的变化更加明显,程序中使用的占空比差距更大。
#include
sbit PWMOUT = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

unsigned char HighRH = 0; //高电平重载值的高字节
unsigned char HighRL = 0; //高电平重载值的低字节
unsigned char LowRH = 0; //低电平重载值的高字节
unsigned char LowRL = 0; //低电平重载值的低字节

void ConfigPWM(unsigned int fr, unsigned char dc);
void ClosePWM();

void main(){
unsigned int i;
EA = 1; //开总中断
ENLED = 0; //使能独立 LED
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;

while (1){
ConfigPWM(100, 10); //频率 100Hz,占空比 10%
for (i=0; i<40000; i++);
ClosePWM();
ConfigPWM(100, 40); //频率 100Hz,占空比 40%
for (i=0; i<40000; i++);
ClosePWM();
ConfigPWM(100, 90); //频率 100Hz,占空比 90%
for (i=0; i<40000; i++);
ClosePWM(); //关闭 PWM,相当于占空比 100%
for (i=0; i<40000; i++);
}
}
/* 配置并启动 PWM,fr-频率,dc-占空比 */
void ConfigPWM(unsigned int fr, unsigned char dc){
unsigned int high, low;
unsigned long tmp;

tmp = (11059200/12) / fr; //计算一个周期所需的计数值
high = (tmp*dc) / 100; //计算高电平所需的计数值
low = tmp - high; //计算低电平所需的计数值
high = 65536 - high + 12; //计算高电平的重载值并补偿中断延时
low = 65536 - low + 12;//计算低电平的重载值并补偿中断延时

HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节
HighRL = (unsigned char)high;
LowRH = (unsigned char)(low>>8); //低电平重载值拆分为高低字节
LowRL = (unsigned char)low;

TMOD &= 0xF0; //清零 T0 的控制位
TMOD |= 0x01; //配置 T0 为模式 1
TH0 = HighRH; //加载 T0 重载值
TL0 = HighRL;
ET0 = 1; //使能 T0 中断
TR0 = 1; //启动 T0
PWMOUT = 1; //输出高电平
}
/* 关闭 PWM */
void ClosePWM(){
TR0 = 0; //停止定时器
ET0 = 0; //禁止中断
PWMOUT = 1; //输出高电平
}
/* T0 中断服务函数,产生 PWM 输出 */
void InterruptTimer0() interrupt 1{
if (PWMOUT == 1){ //当前输出为高电平时,装载低电平值并输出低电平
TH0 = LowRH;
TL0 = LowRL;
PWMOUT = 0;
}else{ //当前输出为低电平时,装载高电平值并输出高电平
TH0 = HighRH;
TL0 = HighRL;
PWMOUT = 1;
}
}
需要提醒大家的是,由于标准 51 单片机中没有专门的 PWM 模块,所以我们用定时器加中断的方式来产生 PWM,而现在有很多的单片机都会集成硬件的 PWM 模块,这种情况下需要我们做的就仅仅是计算一下周期计数值和占空比计数值然后配置到相关的 SFR 中即可,既使程序得到了简化又确保了 PWM 的输出品质(因为消除了中断延时的影响)。

大家编译下载程序后,会发现小灯从最亮到灭一共 4 个亮度等级。如果我们让亮度等级更多,并且让亮度等级连续起来,会产生一个小灯渐变的效果,与呼吸有点类似,所以我们习惯上称之为呼吸灯,程序代码如下,这个程序用了 2 个定时器 2 个中断,这是我们第一次这样用,大家可以学习一下。我们来试试这个程序,试完了大家一定要能自己把程序写出来,切记。
纯文本复制
#include
sbit PWMOUT = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

unsigned long PeriodCnt = 0; //PWM 周期计数值
unsigned char HighRH = 0; //高电平重载值的高字节
unsigned char HighRL = 0; //高电平重载值的低字节
unsigned char LowRH = 0; //低电平重载值的高字节
unsigned char LowRL = 0; //低电平重载值的低字节
unsigned char T1RH = 0; //T1 重载值的高字节
unsigned char T1RL = 0; //T1 重载值的低字节

void ConfigTimer1(unsigned int ms);
void ConfigPWM(unsigned int fr, unsigned char dc);

void main(){
EA = 1; //开总中断
ENLED = 0; //使能独立 LED
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;

ConfigPWM(100, 10); //配置并启动 PWM
ConfigTimer1(50); //用 T1 定时调整占空比
while (1);
}
/* 配置并启动 T1,ms-定时时间 */
void ConfigTimer1(unsigned int ms){
unsigned long tmp; //临时变量
tmp = 11059200 / 12; //定时器计数频率
tmp = (tmp * ms) / 1000; //计算所需的计数值
tmp = 65536 - tmp; //计算定时器重载值
tmp = tmp + 12; //补偿中断响应延时造成的误差
T1RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
T1RL = (unsigned char)tmp;
TMOD &= 0x0F; //清零 T1 的控制位
TMOD |= 0x10; //配置 T1 为模式 1
TH1 = T1RH; //加载 T1 重载值
TL1 = T1RL;
ET1 = 1; //使能 T1 中断
TR1 = 1; //启动 T1
}
/* 配置并启动 PWM,fr-频率,dc-占空比 */
void ConfigPWM(unsigned int fr, unsigned char dc){
unsigned int high, low;
PeriodCnt = (11059200/12) / fr; //计算一个周期所需的计数值
high = (PeriodCnt*dc) / 100; //计算高电平所需的计数值
low = PeriodCnt - high; //计算低电平所需的计数值
high = 65536 - high + 12; //计算高电平的定时器重载值并补偿中断延时
low = 65536 - low + 12; //计算低电平的定时器重载值并补偿中断延时
HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节
HighRL = (unsigned char)high;
LowRH = (unsigned char)(low>>8); //低电平重载值拆分为高低字节
LowRL = (unsigned char)low;

TMOD &= 0xF0; //清零 T0 的控制位
TMOD |= 0x01; //配置 T0 为模式 1
TH0 = HighRH; //加载 T0 重载值
TL0 = HighRL;
ET0 = 1; //使能 T0 中断
TR0 = 1; //启动 T0
PWMOUT = 1; //输出高电平
}
/* 占空比调整函数,频率不变只调整占空比 */
void AdjustDutyCycle(unsigned char dc){
unsigned int high, low;
high = (PeriodCnt*dc) / 100; //计算高电平所需的计数值
low = PeriodCnt - high; //计算低电平所需的计数值
high = 65536 - high + 12; //计算高电平的定时器重载值并补偿中断延时
low = 65536 - low + 12; //计算低电平的定时器重载值并补偿中断延时

HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节
HighRL = (unsigned char)high;
LowRH = (unsigned char)(low>>8); //低电平重载值拆分为高低字节
LowRL = (unsigned char)low;
}
/* T0 中断服务函数,产生 PWM 输出 */
void InterruptTimer0() interrupt 1{
if (PWMOUT == 1){ //当前输出为高电平时,装载低电平值并输出低电平
TH0 = LowRH;
TL0 = LowRL;
PWMOUT = 0;
}else{ //当前输出为低电平时,装载高电平值并输出高电平
TH0 = HighRH;
TL0 = HighRL;
PWMOUT = 1;
}
}
/* T1 中断服务函数,定时动态调整占空比 */
void InterruptTimer1() interrupt 3{
static bit dir = 0;
static unsigned char index = 0;
unsigned char code table[13] = { //占空比调整表
5, 18, 30, 41, 51, 60, 68, 75, 81, 86, 90, 93, 95
};

TH1 = T1RH; //重新加载 T1 重载值
TL1 = T1RL;
AdjustDutyCycle(table[index]); //调整 PWM 的占空比
if (dir == 0){ //逐步增大占空比
index++;
if (index >= 12){
dir = 1;
}
}else{ //逐步减小占空比
index--;
if (index == 0){
dir = 0;
}
}
}

呼吸灯效果做出来后,利用这个基本原理,其它各种效果的灯光闪烁都应该可以做出来,大家看到的 KTV 里边那绚丽的灯光闪烁,其实就是采用的 PWM 技术控制的。

来源:玩转单片机

围观 1153

什么是单片机,相信很多人都还不知道。也不知道单片机的作用是什么。单片机简称为单片微控制器(Microcontroler),它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上,相当于一个微型的计算机,因为它最早被用在工业控制领域。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对提及要求严格的控制设备当中。

大家都知道我们的电脑主要是由中央处理单元CPU(进行运算、控制)、随机存储器RAM(数据存储)、存储器ROM(程序存储)、输入/输出设备I/O(串行口、并行输出口等)。安装在一个被称之为主板的印刷线路板上,就是我们个人的计算机了。

把单片机看成一个整体分成四块就很容易认识了。 把这些东西(CPU,硬盘,内存,主板等等)用集成块做好后,如下图所视:

一文看懂单片机与CPU的相似与不同

单机片

就成了我们要学习的“单片机”了。而在单机片的内部,CPU,硬盘,内存,主板等等却又是另外的名字。

1)CPU(Central Processing Unit)。它是单片机的核心部件,包括运算器和控制器。运算器既是算术逻辑单元ALU(Arithmetic logic Unit),其功能是进行算术运算和逻辑运算。控制器一般由指令寄存器、指令译码器、时序电路和控制电路组成。起作用是完成取指令、将指令译码形成各种微操作并执行指令,同时控制计算机的各个部件有条不紊地工作。

一文看懂单片机与CPU的相似与不同

cpu内部图

2)计算机中的内存,在单片机里叫数据存储器,也叫随机存储器。用RAM(Random Access Memery)表示。其作用是用于存放运算的中间结果,数据暂存和缓冲,标志位等。特点是:掉电后会丢失数据。

一文看懂单片机与CPU的相似与不同

程序存储器

3)计算机中的硬盘,在单片机中,叫程序存储器,也叫只读存储器。用ROM(Read only memery)表示。其作用和硬盘差不多,用来存放用户程序。特点是:掉电后不会丢失数据。

4)输入/输出设备I/O“主板”,在单片机里,叫做I/O(输入输出设备)当然也包含了串行口,并行口,定时器,记时器等等。

一文看懂单片机与CPU的相似与不同

单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。

本文引用地址: http://www.eepw.com.cn/article/201702/343732.htm

围观 499

来源:玩转单片机

单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。

⒈ 电源:
⑴ VCC - 芯片电源,接+5V;
⑵ VSS - 接地端;
⒉ 时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。
⒊ 控制线:控制线共有4根,
⑴ ALE/PROG:地址锁存允许/片内EPROM编程脉冲
① ALE功能:用来锁存P0口送出的低8位地址
② PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
⑵ PSEN:外ROM读选通信号。
⑶ RST/VPD:复位/备用电源。
① RST(Reset)功能:复位信号输入端。
② VPD功能:在Vcc掉电情况下,接备用电源。
⑷ EA/Vpp:内外ROM选择/片内EPROM编程电源。
① EA功能:内外ROM选择端。
② Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。
⒋ I/O线
80C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。

拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。
1、 电源:这当然是必不可少的了。单片机使用的是5V电源,其中正极接40管脚,负极(地)接20管脚。
2、 振蒎电路:单片机是一种时序电路,必须供给脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶体震荡器,电容,连上就能了,按图1接上即可。
3、 复位管脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。
4、 EA管脚:EA管脚接到正电源端。 至此,一个单片机就接好,通上电,单片机就开始工作了。

我们的第一个任务是要用单片机点亮一只发光二极管LED,显然,这个LED必须要和单片机的某个管脚相连,不然单片机就没法控制它了,那么和哪个管脚相连呢?单片机上除了刚才用掉的5个管脚,还有35个,我们将这个LED和1脚相连。(见图1,其中R1是限流电阻)

按照这个图的接法,当1脚是高电平时,LED不亮,只有1脚是低电平时,LED才发亮。因此要1脚我们要能够控制,也就是说,我们要能够让1管脚按要求变为高或低电平。即然我们要控制1脚,就得给它起个名字,总不能就叫它一脚吧?叫它什么名字呢?设计51芯片的INTEL公司已经起好了,就叫它P1.0,这是规定,不能由我们来更改。

2

名字有了,我们又怎样让它变'高'或变'低'呢?叫人做事,说一声就能,这叫发布命令,要计算机做事,也得要向计算机发命令,计算机能听得懂的命令称之为计算机的指令。让一个管脚输出高电平的指令是SETB,让一个管脚输出低电平的指令是CLR。因此,我们要P1.0输出高电平,只要写SETB P1.0,要P1.0输出低电平,只要写 CLR P1.0就能了。

现在我们已经有办法让计算机去将P10输出高或低电平了,但是我们怎样才能计算机执行这条指令呢?总不能也对计算机也说一声了事吧。要解决这个问题,还得有几步要走。第一,计算机看不懂SETB CLR之类的指令,我们得把指令翻译成计算机能懂的方式,再让计算机去读。计算机能懂什么呢?它只懂一样东西——数字。因此我们得把SETB P1.0变为(D2H,90H ),把CLR P1.0变为 (C2H,90H ),至于为什么是这两个数字,这也是由51芯片的设计者--INTEL规定的,我们不去研究。第二步,在得到这两个数字后,怎样让这两个数字进入单片机的内部呢?这要借助于一个硬件工具"编程器"。如果你还不知道是什么是编程器,我来介绍一下,就是把你在电脑上写出来来的代码用汇编器等编译器生成的一个目标烧写到单片机的eprom里面去的工具,80c51这种类型的单片机编程是一件很麻烦的事情,必要要先装到编程器上编程后才能在设备上使用,而目前最新的AT89s51或者STC89C51单片机能支持在线编程(isp)功能,不用拔出来利用简单的电路就可以实现把代码写入单片机内部,本站有详细的编程器制作教程下载。

下面我们来实战一下:下图(图2)所示的软件名字叫keil —>点此下载,是用来编写程序代码并生成一个可以写入到单片机芯片的Hex文件(我们人要控制单片机只能用汇编语言或者C语言而单片机不认识怎么办呢?所以keil这个软件就把程序语言转换成了一种特定格式的Hex文件,只要把这个文件下载到单片机芯片单片机就会按我们程序的思路来运行)

3

4

好了…… ,我们把 SETB P1.0 这条汇编语句用keil软件编译生成Hex文件,然后用图3所示的软件和图1所示的硬件(用串口连接电脑)下载到我们已经做好的电路板上的单片机芯片里去(图省事的话建议直接买个开发板),然后接通电源……什么?灯不亮?这就对了,因为我们写进去的指令就是让P10输出高电平,灯当然不亮,要是亮就错了。所以要将keil编缉区的内容改为CLR P1.0,重新编译生成Hex文件,重新下载,接电,好,灯亮了。因为我们写入的Hex就是让P10输出低电平的指令。这样我们看到,硬件电路的连线没有做任何改变,只要改变写入单片机中的内容,就能改变电路的输出效果。

围观 333

微控制器将在观光噪比(IoT)取向设计大多数因特网主控制元件和这些MCU将有可能被电池供电。电源效率将是实现可接受的电池寿命至关重要因此MCU将需要管理的电池使用更精确地比以往任何时候。许多MCU具有特殊的功能,帮助管理电池电量和使用这些功能优化可能使输赢在市场之间的差异。

本文将很快回顾一些实现高效电池的MCU产品设计,并说明所需的关键功能,例如使用的设备,这些功能如何提高工作效率和电池寿命。软件工具,帮助估计电池寿命将用于展示如何在您详细的设计实施估计寿命。这极大地有助于设备选择并且是一个关键的技术用于创建电源效率的设计。

管理电源域

电池的MCU实现时想我们最初可能,前提是有一个单一的MCU电源域,流失的电池,我们的目标是管理这个电源域打造最节能的微控制器实现成为可能。很快我们就会发现这种假设通常是假的,但是,即使是简单的MCU通常具有片上多电源域。事实证明,有多个电源域可以是一个很大的优势,当电源效率是最重要的,以我们的设计。具有多个域可以让我们更有效地管理和控制电源到MCU的是基于我们需要执行为特定实现的功能所需的部分。让我们来看一个具体的MCU,看多电源域怎么可能是有利的一个典型的电池供电的设计。

所述STM32F0x1系列MCU(例如,STM32F051K8U6)是STM32 MCU系列入门级装置,并且因此是可在基于电池的应用中经常使用的装置的一个很好的例子。下面的图1显示了为STM32F0x1 / X2设备的各种电源域。的VDDA域权力模拟导向块中的装置,并包括用于在A / D转换器,D / A转换器,温度传感器,复位发生器和时钟的PLL功能。该VDDIO2电源域可在STM32F04x / 7X / 9x的设备,并提供了一个独立的I / O电源轨时,不同的I / O标准需要得到支持(该电源电压范围为1.65〜3.6 V,以支付各种I / O标准)。主VDD功率域提供功率,以大量的装置。这包括在非STM32F04x / 7X / 9X设备的I / O环,待机电路和唤醒逻辑通常总是在,它也通过权力1.8 V数字核心(处理器,内存和数字外设)一个片上稳压器。

意法半导体STM32F0x1 / X2电源图片


图1:STM32F0x1 / X2电源显示电池备份域。 (意法半导体提供)

最终的电源域,从外部VBAT引脚源,提供电源备份域。备份功能包括一个低能量的32 kHz晶振时钟振荡器,备份寄存器保持其值,即使电源中断,给设备的其他部分(方便保存重要的数据,系统复位和电源之间波动),而真正的-time时钟(RTC)的块。一个低电压检测器可以自动切换到在VBAT输入时在VDD信号低于设定的阈值,以简化电池备份实现。

这些独立电源域可以很容易地控制和管理传送到MCU根据由应用程序所需的动作时的功率。例如,如果设备正在等待的RTC信号它的时刻开始的模拟 - 数字,大部分装置可以掉电只用电池备份域操作。该RTC超时可以切换的I / O信号,提醒外部电源管理器件,然后可以打开额外的电源域。这可以是一个非常功率高效的技术,但需要一个外部功率和电池管理装置。

在一些应用中STM32F0x1 / X2器件将通过将装置的各个部分进入低功率模式,管理的时钟频率和测量电压源管理电池和电源,以在其自己的密钥块,以检测何时低电压电平可能会影响操作。在这些应用程序的多个片上电压域和低功耗工作模式都是关键要求。现在让我们看看在低功耗模式,更详细地了解他们与多个芯片的电源域是如何工作的进一步提高电池的实现方案的电源效率。
为了帮助工程师设计开发意法半导体提供的STM32F0系列的产品培训模块概述。

低功耗MCU运行模式延长电源效率

几乎所有的MCU现在提供各种各样的减少通过限制工作频率和/或重点区块的可操作性操作电源的低功耗工作模式。这些模式有各种各样的名字,但它们的功能往往是非常相似的。飞思卡尔MCU MCF51QE系列的低功耗工作模式,你应该寻找时,电源效率是您的应用程序的关键类型的一个很好的例子。甲状态转移图和简单的功率调节表示于图2来说明这些模式如何可以用来提高功率效率。该运行模式不限制经营和监管工作在全开状态。在其它模式中的各种块进行操作使用较低的功率通过关闭电源键元件或通过降低工作频率。例如,在等待模式中的CPU关闭以节省电力,但外设在它们的全时钟速率操作。这节省了功率时不需要CPU的运行,但定时器或通信外围设备必须继续工作。通常,这些外设可以通过中断刚睡醒的CPU当CPU是必需的。到关闭CPU的能力可以节省一个显著量运行功率的由于CPU,操作时,采用多数所述MCU功率预算。每个低功率模式的更详细的说明在下面的部分中提供。

飞思卡尔MCF51QE128低功耗模式的图像


图2:飞思卡尔MCF51QE128低功耗模式。 (飞思卡尔提供)

运行模式 - CPU时钟可以全速运行,内部供应是充分的监管。
LPrun模式 - CPU和外设时钟被限制为250 kHz的CPU时钟和125 kHz的总线时钟最大的内部供应处于软监管。
等待模式 - CPU关闭以节省电能;外设时钟正常运行,内部稳压器正常工作。
LPwait模式 - CPU关闭以节省电能;外设时钟是在低速(125 kHz的最大值)和内部稳压器在宽松的监管模式下运行运行。
停止模式 - 系统(CPU和外设)时钟停止。
STOP4 - 所有的内部电路供电(全调节模式)和内部时钟源仍处于最高频率最快的恢复。
停止3 - 所有的内部电路松散的监管和时钟源的最低值(125 kHz的最大值),提供用电和恢复速度之间的良好平衡。
停止2 - 内部电路的部分电源关闭; RAM内容被保留。在低功耗模式,此设备。需要复位从停止2模式恢复。

在运行,等待和停止模式普遍存在于现代MCU和非常功耗节能设计提供了依据。尤其是,应用程序,只定期使用主CPU - 也许只进行平均大量传感器读数或管理接收到的数据缓冲器,当缓冲器接近充满 - 可以通过关闭CPU和让智能节省功率的戏剧性量外围设备处理尽可能多的算法成为可能。等待和停止之间的区别通常体现在响应时间,因为它通常需要更长的时间来块从低功耗状态通电(即减少一个典型的停止模式下,静态电流),而不是删除一个时钟门控信号一个块(即只减少动态电流在典型等待模式)。

可以在MCF51QE128的LPrun和LPwait模式提供了另一种技术,通过运行在CPU和/或外围设备,以降低功耗低得多的频率比正常。当操作不容易被周期性地执行,而且必须连续运行,而不必在高速运行时非常有用。例如,通信数据包可能以高速在正常运行模式中接收,但LPrun可以用来处理数据。这是特别有用的,如果处理时间是依赖于数据的,并且不能经由周期性定时器中断很容易地进行管理。一旦数据被处理时,LPwait状态可以进入等待,直到下一数据分组需要被接收。

结合使用不同的电源域和低功耗模式允许多种有效实现。寻找各种时钟频率,低功耗模式和状态转换的最佳组合可以是一个艰巨的运动,通常需要事先对具体实施工作要做,或者你可能会发现使用已选定的设备并影响项目进度不能满足你的操作要求显著。理想情况下,你会希望能够模拟各种运行功率水平,估计电池寿命为目标的应用程序。幸运的是(或者也许是因为他们明白这一点的难度)的MCU厂商都创造了一些评估工具,我们可以用它来解决这个难题。

软件工具帮助评估电力需求和电池寿命

其中一个使用的工具越容易从Microchip XLP电池寿命估算(BLE)1。这个免费下载的工具,与任何XLP单片机工程估算功耗在整个应用程序。它也可以被用于获取的功耗为您的XLP MCU设计内键例程详细估计。下面的图3显示了BLE的图形用户界面(GUI)。您只需选择您的设备,你的电压和温度,然后你的目标电池(步骤1至3的GUI)。然后,您可以指定关键业务应用程序,定义工作频率,该函数使用模式下,时间的功能被激活和各种模块(如ADC,UART,定时器等)功能时有效。 (在下面的例子中有一个在运行模式在16兆赫,两种休眠模式功能并在1 MHz的运行模式功能的功能)的软件自动确定在每个功能所使用的电流,然后报告所估计的电池寿命该设计。在这个例子中,电池的寿命估计在不到200天。一个完整的文本文件,报告可以生成保存程序设置和结果。一个例子示于图3的底部。

将Microchip XLP电池寿命估算程序映像


图3:Microchip的XLP电池寿命估算程序 - GUI和报告。 (Microchip的提供)

使用的电池寿命估算程序可以很容易地找出关键程序和您的应用程序使用最多的功率。这使您可以调整设计,同时尝试不同的设备,以找到合适的实现。这样做之前,详细的编码和电路板设计可以节省你浪费显著努力探索的选项,将无法实现,你需要一个成功的设计的电源效率。

一旦你有信心,你的选择,你可以再取使用评估套件,如Microchip的PIC24F评估和演示工具包的下一个步骤。通常,这些套件包括了丰富的示例代码,参考设计和丰富的文档,可以很容易编写你的关键程序和测量实际的功率水平,你会在全面实施得到。

新的低功耗技术的高效电池的实现方案

MCU厂商也在推动技术信封不断创造从头开始新的低功耗功能。德州仪器创造低功耗面向MCU的使用新的非易失性存储器的铁电RAM或FRAM,它结合了速度,灵活性一个家庭,和SRAM的耐力与闪光灯的稳定性和可靠性,都在较低的总功率消耗。 FRAM存储器具有超低功耗和快速(每字125纳秒)写道。 FRAM可以用作程序,数据,或存储到简化应用开发。 FRAM的超低功耗,非易失性使其成为电池供电的MCU应用需要,如数据汇总和传感器预处理显著存储访问和计算能力的绝佳选择。

该MSP430FR微控制器系列还具有关键的低功耗模式,智能外设,以及先进的处理能力。图4中的框图显示所有关键MCU功能的MSP430FR5731 / 5/9的设备可用。还检查了TI产品培训模块,涵盖了TI MSP430FR MCU系列的特性,并展示了如何在FRAM技术为各种应用显著的低功耗优势。

德州仪器MSP430FR5731 / 5/9框图图片


图4:德州仪器MSP430FR5731 / 5/9框图。 (德州仪器提供)

结论

很多物联网应用程序将使用电池供电的MCU实现和电源效率将是成功的产品是至关重要的。选择合适的MCU为您实现更容易,当你使用一个功率估计工具来选择合适的设备为您的目标应用程序。

来源: http://www.21ic.com/app/mcu/201612/696466.htm

围观 239

来源:赛迪顾问

一、下游应用牵引MCU产业前景向好

(一)物联网

自上世纪70年代问世以来,单片机(Microcontroller Unit,MCU)就凭借其极强的通用型和极高的研发普及率成为全球嵌入式电子应用领域不可或缺的核心部件。网络通信、工业控制、汽车电子、消费电子、金融电子等领域都离不开MCU产品的支持。未来,物联网相关应用将是集成电路(Integrated Circuit,IC)和电子信息终端产品的发展方向,无论是工业制造业、汽车还是消费电子,都在向互联互通的方向演进升级。新增的物联网设备和老旧设备的物联网替代将是未来发展的主题。

通常情况下,物联网设备都需要具备嵌入式控制、传感数据采集、能耗控制及数据交互通信等功能。在数据吞吐量较大、通信协议较复杂、对主控芯片运算精度要求较高的场合,主流的解决方案多采用32位MCU;而在轻负荷、要求快速响应的应用中,16位及8位MCU仍有大量需求,特别是8位MCU凭借其成本优势及开发的便利,在一些颗粒度较小的模块中仍然大规模使用。综合来看,随着下游物联网产业的演进和相关技术的快速发展,MCU市场必将延续高速稳定增长的态势。

(二)智能卡

数据显示,MCU芯片在智能卡领域的出货量接近50%,而从销售收入看,智能卡领域的收入占比达到15.8%。近年来,随着加密算法、NFC等相关技术的逐渐成熟,搭载MCU芯片的智能IC卡(Integrated Circuit Card)已基本覆盖日常消费、金融支付、政府及公共事务等各个领域。特别是金融IC卡方面,在政策引导和市场驱动的双重作用下正在加快普及。

目前,全国近400家商业银行中绝大多数都已经发行了金融IC卡。其全面替代磁条卡已成定局。与此同时,银联芯片卡标准已相继落地泰国等旅游业发达的东南亚国家,实现了我国自主研发金融技术标准的对外输出。预计未来几年,智能卡市场将迎来爆发式增长,这也将直接拉动上游的MCU市场。

(三)汽车电子

在汽车智能化的演进趋势下,越来越多的MCU产品被应用于新型智能驾驶控制系统以实现半自动驾驶、自动泊车、巡航控制以及电子稳定控制(ESC)等功能。与此同时,越来越多的汽车制造商开始致力于扩展驾驶辅助系统功能,使之在5-10年后能够最终实现无人驾驶功能,这将为车用MCU和传感器市场的发展带来机会。

新能源汽车方面,据中国汽车工业协会统计,截至2016年11月,我国累计生产新能源汽车42.7万辆,销售40.2万辆。新能源汽车的快速发展也直接拉动了汽车电子用MCU芯片的市场需求。配备大容量片上存储空间和更多I/O接口功能的32位MCU目前已被广泛应用于监视新能源汽车的电池状态,以及纯电动或混动车的启动电功率。未来汽车电子应用仍将是MCU市场的主要增长动力之一。

二、投资MCU企业的三种思路

(一)入股MCU龙头企业,快速切入下游市场

2016年,高通收购恩智浦、软银收购ARM公司无疑是集成电路产业界的两起重磅事件。巧合的是,这两件收购案的标的都与MCU产品有关。恩智浦继2015年收购飞思卡尔后,已成为汽车电子领域MCU的当之无愧的领军企业;而ARM则早已凭借其划时代的IP架构左右着MCU产业生态。成熟型MCU相关企业在研发实力、供应链、市场认可度及客户渠道等方面都具有显著优势。收购成熟型企业一方面可以直接补齐自有产品线,扩大专利覆盖度,优势技术互补形成完整解决方案,同时可通过规模效应实现外延式增长并降低运营成本;另一方面可以快速切入其所在下游应用领域,拓展应用市场范围,扩大市场占有率。

(二)并购成长型MCU及IP设计公司,提升技术层次

成熟型企业间的兼并重组往往是出于战略布局需要,这些公司的普遍特点是运营状况良好,盈利能力较强,市场占有率较高。与之相比,一些初创型或中等体量的芯片企业一方面或多或少存在运营效率低下、产品线较为单一、资金不足或缺乏完善销售渠道等问题;另一方面又在某些细分领域具有技术先进性。这样的公司虽然尚未在市场上占有一席之地,且短时间内难以贡献业绩,却可以作为投资方补齐短板、拓展市场、布局新领域的技术储备。同样地,一些大型芯片企业由于战略布局的需要,会对一些非核心业务部门进行剥离或调整,这些部门也进入了资本市场。国际知名MCU供应商微芯科技就一直贯彻着这种扩张性收购战略。自2010年以来先后凭借收购获得了存储器控制、蓝牙及Wi-Fi无线连接、车载娱乐系统、悬浮手势、屏幕触控、气体监测等方面的相关技术及专利,持续提升着其MCU技术层次。

(三)搭车全球产能扩张,投资产业链下游环节

MCU虽然属于通用型芯片,但是汽车、工业、网络通信等应用领域因其具有不同的行业标准,对工艺的要求也有较大差别。因此,国际MCU领军厂商多采取IDM的运营策略。目前,中国大陆及台湾地区的MCU设计企业基本都是Fabless的经营模式,整体实力及营收规模方面与国际领先厂商有着较大差距,因此在工艺流程环节基本不具备议价能力,产业链环节缺失;此外,申请行业认证的周期一般较长。以汽车电子用芯片为例,从前期研发到通过最终验证可能需要2-3年的时间,这与大陆及台湾半导体厂商产品快速上市的经营理念相悖。随着新能源汽车产业、智能制造产业的迅速发展,MCU的应用场景也将持续拓展,投资产业链下游的制造环节,完善针对不同应用领域的工艺技术,打造虚拟IDM集团的投资路径初步显现。

三、关注国际并购把脉市场契机

(一)密切关注全球产业界重大兼并重组

同业公司间的兼并重组多出于扩展产品线、扩大市场份额等目的,而在体量较大的并购案后,往往会出现一系列连锁的业务优化调整举措,如NXP在收购Freescale仅一个月后,便将其RF部门出售给中国建广资本;2016年6月,又宣布将分立器件及逻辑IC部门出售给建广资本为首的中国财团。无独有偶,2016年11月,中国IC设计公司华大半导体发布声明,将通过旗下的晶门科技收购微芯公司的触控技术资产;而就在今年2月份,微芯公司刚刚完成对另一家触控芯片提供商爱特梅尔(Atmel)的收购。因此,中国产业界公司及金融资本应密切关注国际IC巨头的战略层面的合纵连横,通过聘请专业的行业咨询公司等途径拆解分析并购双方的业务及产品线,以发现潜在的投资机会。

(二)重点考察下游应用优势企业

当前,全球主流MCU厂家的高端产品基本都是基于ARM或8051架构。不同于专注某一嵌入式应用场景的SoC芯片,MCU产品更强调通用性,且由于MCU芯片对集成度和工艺制程的要求相对较低,国际大厂之间基本不存在技术壁垒。在市场上的产品趋于同质化的环境下,各家MCU厂商的策略是深耕下游应用领域以取得差异化竞争优势,如NXP在智能卡领域份额较高,而瑞萨电子则在汽车电子领域优势明显。未来,随着集成电路企业势力范围的划定,一家公司通吃下游领域的可能性将微乎其微。因此,下游应用市场前景将直接决定芯片提供商的可持续发展能力。

(三)“异构”产品短时间内难以爆发

除了目前绝对主流的ARM架构和传统的8051架构,目前市面上还有基于MIPS架构的MCU产品。2015年9月,Microchip宣布将其基于新的MIPS M5150架构的PIC32MZ产品系列的时钟频率提升至200MHz。虽然在某些参数性能上,非主流架构MCU能够取得局部领先,但是由于其应用范围较窄,相关研发人员不足,产业生态基础极为薄弱。以服务器芯片领域作为对比,Power架构、MIPS架构的服务器芯片始终未能获得市场认可。IBM在中国普及Power架构的力度不可谓不大,但是目前却依然没有一家公司做出成绩。因此,在没有颠覆性的技术革新的情况下,ARM架构及8051架构MCU依然将会占据绝大部分市场份额。

围观 344

常见单片机芯片分析简介

● HT:工具好用.DEMO难搞.成本中等.
● PIC:工具难用,DEMO易搞.成本偏高.
● FREESCALE:工具难用,DEMO易搞.成本偏高.
● STC/51:工具好用,DEMO易搞.成本偏低.
● AVR:工具好用,DEMO易搞.成本中等.
● MSP430:工具非常好用,DEMO易搞.成本偏高.
● EMC:工具好用,DEMO难搞.成本偏低.
● SUNPLUS:工具难用,DEMO难搞.成本偏低.
● TENX:工具难用,DEMO难搞.成本偏低.
● OKI:工具难用,DEMO难搞.成本偏低.
● EPSON:工具难用,DEMO易搞.成本偏低.
● PHILIPS:工具好用,DEMO易搞.成本偏高.
● WINBOND:工具好用,DEMO易搞.成本中等.

国内几种常用的单片机芯片做个简介:

PIC单片机:
是MICROCHIP公司的产品,其突出的特点是体积小,功耗低,精简指令集,抗干扰性好,可靠性高,有较强的模拟接口,代码保密性好,大部分芯片有其兼容的FLASH程序存储器的芯片.

EMC单片机:
是台湾义隆公司的产品,有很大一部分与PIC 8位单片机兼容,且相兼容产品的资源相对比PIC的多,价格便宜,有很多系列可选,但抗干扰较差.

ATMEL单片机(51单片机):
ATMEl公司的8位单片机有AT89、AT90两个系列,AT89系列是8位Flash单片机,与8051系列单片机相兼容,静态时钟模式;AT90系列单片机是增强RISC结构、全静态工作方式、内载在线可编程Flash的单片机,也叫AVR单片机.

PHLIPIS 51PLC系列单片机(51单片机):
PHILIPS公司的单片机是基于80C51内核的单片机,嵌入了掉电检测、模拟以及片内RC振荡器等功能,这使51LPC在高集成度、低成本、低功耗的应用设计中可以满足多方面的性能要求.

HOLTEK单片机:
台湾盛扬半导体的单片机,价格便宜,种类较多,但抗干扰较差,适用于消费类产品.

TI公司单片机(51单片机):
德州仪器提供了TMS370和MSP430两大系列通用单片机.TMS370系列单片机是8位CMOS单片机,具有多种存储模式、多种外围接口模式,适用于复杂的实时控制场合;MSP430系列单片机是一种超低功耗、功能集成度较高的16位低功耗单片机,特别适用于要求功耗低的场合

国际电子公司的单片机芯片产品:
(按照公司进行说明,读者可以和楼2的内容比较着阅读,不太好合在一起写,分开着写了)

1. MOTOROLA单片机
MOTOROLA是世界上最大的单片机厂商。品种全、选择余地大、新产品多是其特点,在8位机方面有68HC05和生级产品68HC08,68HC05有30多个系列,200多个品种,产量已超过20亿片。8位增强型单片机68HC11也有30多个品种,年产量在1亿片以上。生级产品有68HC12。16位机68HC16也有十多个品种。32位单片机的683XX系列也有几十个品种。近年来,以PowerPC、Coldfire、M.CORE等为CPU,将DSP未为辅助模块集成的单片机也纷纷推出,目前仍是单片机的首选牌品。MOTOROLA单片机特点之一是在同样速度下所用的时钟频率较Intel类单片机低得多,因而使得高频噪声低、抗干扰能力强,更适合用于工控领域及恶劣的环境。MOTOROLA8位单片机过去的策略是以掩膜为主,最近推出OTP计划以适应单片机发展趋势,在32位机上,M.CORE在性能和功耗方面都胜过ARM7。

2. Microchip单片机
Microchip单片机是市场份额增长最块的单片机。它的主要产品是16C系列8位单片机,CPU采用RISC结构,仅33条指令,运行速度快,且以低价位著称,一般单片机价格都在一美元以下。Microchip单片机没有掩膜产品,全都是OTP器件(近年已推出FLASH型单片机——编者注)。Microchip强调节约成本的最优化设计,使用量大、档次低、价格敏感的产品。

3. Scenix单片机
Scenix单片机的I/O模块有新意。I/O模块的集成与组合技术是单片机技术不可缺少的重要方面。除传统的I/O功能模块如并行I/O、URT、SPI、I2C、A/D、PWM、PLL、DTMF等,新的I/O模块不断出现,如USB,CAN、J1850,最具代表性的是MOTOROLA32位单片机,它集成了包括各种通信协议在内的I/O模块,而Scenix单片机在I/O模块的处理上引入虚拟I/O的新概念。Scenix采用了RISC结构的CPU,使CPU最高工作频率达50MHz。运算速度接近50MIPS。有了强有力的CPU,各种I/O功能便可以用软件的办法模拟。单片机的封装采用20/28引脚。公司提供各种I/O的库函数,用于实现各种I/O模块的功能。这些用软件完成的模块包括多路UART、多种A/D、PWM、SPI、DTMF、FSK、LCD驱动等,这些都是通常用硬件实现起来也相当复杂的模块。

4. NEC单片机
NEC单片机自成体系,以8位单片机78K系列产量最高,也有16位、32位单片机。16位以上单片机采用内部倍频技术,以降低外时钟频率。有的单片机采用内置操作系统。NEC的销售策略著重于服务大客户,并投入相当大的技术力量帮助大客户开发产品。

5. 东芝单片机
东芝单片机的特点从4位机到64位,门类齐全。4位机在家电领域仍有较大的市场。8位机主要有870系列、90系列等,该类单片机允许使用慢模式,采用32K时钟时功耗低至10uA数量级。CPU内部多组寄存器的使用,使得中断响应与处理更加快捷。东芝的32位单片机采用MIPS3000ARISC的CPU结构,面向VCD、数字相机、图像处理等市场。

6. 富士通单片机
富士通也有8位、16位和32位单片机,但8位机使用的是16位机的CPU内核。也就是说8位机与16位机所用的指令相同,使得开发比较容易。8位单片机有著名的MB8900系列,16位机有MB90系列。富士通公司注重于服务大公司、大客户,帮助大客户开发产品。

7. Epson单片机
Epson公司以擅长制造液晶显示器著称,故Epson单片机主要为该公司生产的LCD配套。其单片机的特点是LCD驱动部分做得特别好。在低电压、低功耗方面也很有特点。目前0.9V供电的单片机已经上市,不久的将来,LCD显示的手表类单片机将使用0.5V供电。

8.8051单片机
最早由Intel公司推出的8051/31类单片机也世界上用量最大的几种单片机之一。由于Intel公司在嵌入式应用方面将重点放在186、386、奔腾等与PC类兼容的高档芯片的开发上,8051类单片机主要由Philips、三星、华邦等公司接产。这些公司都在保持与8051单片机兼容的基础上改善了8051许多特点(如时序特性)。提高了速度、降低了时钟频率,放宽了电源电压的动态范围,降低了产品的价格。

9. Zilog单片机
Z8单片机是Zilog公司的产品,采用多累加器结构,有较强的中断处理能力。产品为OTP型,Z8单片机的开发工具可秤价廉物美。Z8单片机以低价位的优势面向低端应用,以18引脚封装为主,ROM为0.5-2k。最近Zilog公司又推出了Z86系列单片机,该系列内部可集成廉价的DSP单元。

10. NS单片机
COP8单片机是美国国家半导体公司的产品,该公司以生产先进的模拟电路著称,能生产高水平的数字模拟混合电路。COP8单片机片内集成了16位A/D,这是单片机中不多见的。COP8单片机内部使用了抗EMI电路,在看门狗电路以及STOP方式下单片机的唤醒方式上都有独到之处。此外,COP8的程序加密控制也做得特别好。

11. 三星单片机
三星单片机有KS51和KS57系列4位单片机,KS86和KS88系列8位单片机,KS17系列16位单片机和KS32系列32位单片机。三星单片机为OTP型ISP在片编程功能。三星公司以生产存储器芯片著称,在存储器的市场供大于求的形式下,涉足参与单片机的竞争。三星公司在单片机技术上引进消化发达国家的技术,生产与之兼容的产品,然后以价格优势取胜。例如在4位机上采用NEC的技术,8位机上引进Zilog公司Z8的技术,在32位机上购买了ARM7内核,还有DEC的技术、东芝的技术等。其单片机裸片的价格相当有竞争力。

12. 华邦单片机
华邦单片机属8051类单片机,它们的W78系列与标准的8051兼容,W77系列位增强型51系列,对8051的时序作了改进。同样时钟频率下速度提高了2.5倍,FLASH容量从4k到64k,有ISP功能。在4位单片机方面华邦有921系列带LCD驱动的741系列。在32位机方面,华邦使用了惠普公司PA-RISC单片机技术,生产低位的32位RISC单片机。

来源:玩转单片机

围观 639

页面

订阅 RSS - 单片机