2024年5月16日发(作者:郎修齐)
智能电风扇控制器设计与开
发方案
1 绪论
1.1智能电风扇在当今社会中的研究意义
电风扇曾一度被认为是空调产品冲击下的淘汰品,其实并非如此,市场人士称,家
用电风扇并没有随着空调的普及而淡出市场,近两年反而出现了市场销售复的态势。其
主要原因:一是风扇和空调的降温效果不同——空调有强大的制冷功能,可以快速有效
地降低环境温度,但电风扇的风更温和,更加适合老人儿童和体质较弱的人使用;二是
电风扇有价格优势,价格低廉而且相对省电,体积轻巧,摆放方便,安装和使用都非常
简单。
尽管电风扇有其市场优势,但传统电风扇还是有许多地方应当进行改良的,最突出
的缺点是它不能根据温度的变化适时调节风力大小,对于夜间温差大的地区,人们在夏
夜使用电风扇时可能遇到这样的问题:当凌晨降温的时候电风扇依然在工作,可是人们
因为熟睡而无法察觉,既浪费电资源又容易引起感冒,传统的机械定时器虽然能够控制
电风扇在工作一定后关闭,但定时围有限,且无法对温度变化灵活处理。
有鉴于现今家里不可或缺的电器产品电风扇,我们希望可以借由步进电机组合做出
利用红外感应接收模块接收到有人的讯号,来改变电风扇转动的方向,以取代传统电风
扇只能以固定形式转动,希望能够让电风扇自动能感应到人所在的方向,未来让电器更
能人性化、科技化,以达到方便性智利于未来科技产业的发展,我们希望能将科技运用
在电器上,再于产业结合,已达到居家生活里的便利性。现今社会上,不可或缺的是将
生活周遭事物简单化,而我们将运用单芯片在电风扇上,研究出符合未来人们的需求,
研发低成本、多功能的全自动化电风扇让社会大众能够接受,取代传统式手动电风扇,
让科技产业在电器上有重大的突破。于以上方面的考虑,我们需要设计一种智能电风扇
控制系统来解决这些问题。
1.2 研究容及论文安排
1.2.1 研究容
本论文主要目标是使电风扇能够根据人的位置来自动选择送风角度。以SONIX公司
研发的SN8P2501B为主控器,利用红外感应接收装置,接受人体辐射出的红外线,通过
此讯号利用PM35L-048步进电机来改变红外感应接受装置,进而确定人体围,再通过发
光二极管指示锁定角度并模拟风扇循环闪烁。
由手动开关转变为红外线人体感应自动开关,是应用先进的红外线人体感应科技主
动侦测人体的问题是否在探测围,在设定15秒时间都可以探测到人,则开启电机开关,
开启LED角度循环闪烁;若在15秒开始存在有人信号,后存在无人信号,则重新计时
15秒检测;若一直存在无人信号则不操作动作。
1.2.2 论文安排
论文第1章为绪论,主要介绍了电风扇的现状,智能电风扇研究意义,本设计研究
的容及论文安排;第2章为系统设计方案的介绍,包括其具体可实现的功能及方案选择;
第3章为硬件设计部分,这部分详细介绍了所选硬件的特性及其各部分对实现自己所需
要功能的作用及其电路图;第4章为软件设计部分,给出了主程序和各子程序流程图,
程序清单以附件的形式附在论文最后。第5章为结论部分。接下来为致和参考文献。最
后附有原理图及程序清单。
2 系统设计方案
2.1 系统总体介绍
本次设计选用SONIX SN8P2501B为主控制芯片,与外围电路构成人体围检测系统。
MCU记录下侦讯到的人围,并送给LED发光二极管,使其模拟风扇循环闪烁。系统框图
如下图所示:
红外感应模块
微处理器
SN8P2501B
LED循环闪烁模块
步进电机模块
图2-1 系统框图
2.2 系统功能介绍
本系统利用LED发光二极管的循环闪烁来模拟风扇的来回旋转送风动作。主要功能
为:
a) 自动启动及关闭开关
我们由步进电机配合红外感应控制器经由红外线扫描来控制开关,检测到一定时间
有人时自动开启电机开关及LED闪烁;无人时关闭电机开关及LED闪烁。
b) 自动搜索围人数
我们以SN8P2501B来控制步进电机的步数,使它去侦测人数围有多大。
c) 锁定人体位置
我们利用红外感应控制器搜寻配合步进电机步数,有红外感应控制模块传回探测信
号给MCU,再由MCU来记忆人体位置,记录最大最小角度,锁定人体位置。
d) 发光二极管指示锁定角度并模拟风扇循环闪烁
用LED循环闪烁来模拟电风扇来回循环送风动作,每相邻两个LED之间间隔为30°。
例:当锁定人围为30°-90°时,LED从LED1至LED3循环闪烁(LED从左到右依次为
LED1、LED2、LED3、LED4、LED5、LED6,分别代表30°、60°、90°、120°、150°、
180°)。
2.3 设计方案
本设计根据红外感应装置的不同处理共有两种设计方案
a) 方案一
将红外感应模块前的菲泥尔滤光透镜用不透红外的材质覆盖上,让红外感应模块只
能检测到一个小围(小于10°)的红外变化,步进电机正转180°后即可反转180°,
如图2-2所示
图2-2 设计后的红外感应模块探测围
利用这种方法,可以不用考虑红外检测围是否存在人这种情况,原因是LED模拟的
角度是以30°来递增的,相比而言,红外检测的角度远远小于模拟的角度,即使在红
外检测围存在有人,在步进电机旋转一步后就可以检测出来,不会影响到检测的结果。
例:当步进电机正转90°后,红外探头检测到有人(探测角度87.5°…92.5°),
此时记录下的电机步数为X大步(X=3,90°);步进电机再次旋转7.5°,此时检测不
到人(探测围95°…100°),记录此时的电机步数为X+1大步(X=3,120°),对检测
没有什么影响。
图2-3 检测到有人存在
图2-4 下一状态检测不到人
这种方法的优点:思路比较简单,基本没有涉及到算法,在步进电机旋转速度比较
慢的情况下能够很快获得人的位置,从而改变LED的闪烁;缺点:需要利用不透红外材
料来封装,在开机情况下,需要人在此等待十几秒时间,确认一直有人存在开机后才能
离开此位置。
b) 方案二
事先确定红外感应装置的探测角度,步进电机需要正转360°。下面举例说明:
假设红外感应装置的探测角度为150°,人所在围为30°-120°围,则在步进电机
开始正转时就能够检测到有人存在(检测角度-75°…75°),步进电机旋转至90°(3
大步)时仍能检测到人(检测围30°…150°),只有当步进电机旋转至195°(6大步)
时才检测不到人(检测围120°…270°),此时记录的角度为210°(6+1大步),需要
减去红外感应装置探测角度的一半,此时才是真正开始没探测到人时人的位置,即结束
角度,角度为120°(6+1-(2+1)=4大步)(2+1为探测角度一半所占大步);步进电
机继续正转,当步进电机正转至315°(10大步)时,又一次检测到有人(检测围为
240°…30°),此时记录的角度为315°(10大步),仍然需要减去红外感应装置探测
角度的一半,则起始角度为30°(10+(2+1)-12=1大步)(2+1为探测角度一半所占
大步,12为旋转360°所需步数)。这样只记录两次值就得到了人的围,不论人站的稀
疏。
图2-5 红外探头初始位置
图2-6 检测到无人时的位置
图2-7 检测到刚有人时的位置
这种方法的优点:不需要做什么其他操作,开机更加人性化,不需要让电机进行反
转动作,在判断完人围后即可判断是否需要关机操作;缺点:思路有点复杂,中间涉及
到算法问题,事先必须知道此红外感应装置的探测角度,因为步进电机转速比较慢导致
确定一个围需要比较长的时间。
注:方案一和方案二中涉及到得确定围需要的时间是由所选红外感应装置决定的,
在这里所选的BISS0001默认延时时间为10秒,因此需要的时间比较长,如果调为1秒,
则步进电机旋转的速度扩大10倍,需要的时间也就相应缩短。
两种方案硬件电路完全一样,只是对红外感应装置的处理不同,主要表现在红外感
应装置的探测围上,实现不同的方案由程序控制。本设计选用方案一作为主要思路,原
因有几点:思路简单,容易被他人理解;可以允许在未检测区域随意改动位置,在当前
正转结束后用LED模拟显示出;在实物演示中,正转后反转不会对引线产生影响;在较
短时间可以看到演示效果
。
3 硬件设计
本系统主要由微处理器控制、红外感应模块、步进电机模块及LED模拟风扇旋转模
块等组成。下面介绍各部分原理及电路图。
3.1 微处理器
3.1.1 SN8P2500系列介绍
SN8P2500系列单片机是SONIX公司最新推出的高速低功耗8位单片机。它采用低
功耗CMOS设计工艺及高性能的RISC架构,具有优异的抗干扰性能。突出的特点是:低
成本、高抗干扰性、置16Mhz RC振荡电路、高速8位、59条精简指令集。
3.1.2 SN8P2501B单片机介绍
当前市场上的单片机有51系列,STC系列等单片机,考虑到设计只需实现自动开
关机及锁定人围LED闪烁的功能,但又要确保其抗干扰能力强的特点,在考虑功能需求
及成本的基础上,选择了SONIX公司研发的SN8P2501B 8位单片机作为本系统的控制器,
有14个引脚,如图3-1,它具有以下特性:
a) OTP ROM空间:1K * 16位;
b) RAM空间:48 字节;
c) STKP堆栈: 4层;
d) 多种振荡源选择:最大可达16MHz的外部晶振、10MHz的外部RC振荡、部16MHz
的高速时钟及16KHz的低速时钟;
e) 高速的CPU指令周期,可达1T,即每个指令周期为1个时钟周期;
f) 满足低功耗的需求,可编程设定4种工作模式:正常模式、低速模式、睡眠模
式和绿色模式;
g) 置高速PWM/Buzzer输出接口,可输出不同频率的信号;
h) 置RTC实时时钟(0.5s)、看门狗定时器(16KHz3V,32KHz5V)及3级低电压检
测系统;
i) 具有3个中断源,2个部中断源:T0、TC0,1个外部中断源:INT0。
1) I/O引脚配置
I/0口引脚为:
a) 输入输出双向端口:P0、P1、P2、P5;
b) 单向输入引脚:P1.1;
c) 可编程的漏极开路引脚:P1.0;
d) 具有唤醒功能的端口:P0、P1 电平变化触发;
e) 置上拉电阻端口:P0、P1、P2、P5;
f) 外部中断引脚:P0.0,由寄存器PEDGE 控制,其触发方式为上升沿或下降沿。
图3-1 SN8P2501B引脚
2) 程序寄存器
图3-2 程序存储器
SN8P2501B的程序寄存器为OTP ROM(一次性可编程),存储器容量为1K*16位,可
由10位程序计数器PC对程序寄存器进行寻址,或由系统寄存器(R,X,Y和Z)对ROM
的数据进行查表访问。其中:系统复位后从地址0000H开始执行;地址0008H是中断向
量入口地址。
3) 数据存储器
图3-3 数据存储器
SN8P2501B单片机的片RAM共有256个存储单元,地址围为000H-0FFH。片寄存器
可分为通用数据存储区和系统存储器两大部分。通用数据存储区可作为用户自定义的变
量,临时数据,中间数据存放地,而系统寄存器则用来控制片外设或表示外设的状态。
4) 定时/计数器
SONIX SN8P2708A MCU定时/计数器大分致为两大类。一类为基本定时器T0,另一
类为多功能定时器TC0。
二进制定时器T0 溢出(从0FFH 到00H)时,T0 继续计数并给出一个溢出信号触发
T0 中断请求。定时器T0 的主要用途如下:
a) 8 位可编程定时器:根据选定的时钟频率定时产生中断请求;
b) 定时器:根据选定的时钟信号产生中断请求,RTC 功能仅限于编译选项为
High_Clk = IHRC_RTC;
c) 绿色模式唤醒功能:T0ENB = 1 时,T0 溢出将系统从绿色模式中唤醒。
定时/计数器TC0 具有双时钟源,可根据实际需要选择部时钟或外部时钟作为计时
标准。其中,部时钟来自Fcpu,外部时钟INT0 由P0.0 引脚(下降沿触发)输入。寄存
器TC0M 控制时钟源的选择。当TC0 从0FFH 溢出到00H 时,TC0 在继续计数的同时产生
一个溢出信号,触发TC0 中断请求。
TC0 的主要作用如下:
a) 8 位可编程定时器:根据选定的时钟频率在特定时间产生中断信号;
b) 外部事件计数:对外部事件计数;
c) 蜂鸣器输出;
d) PWM输出。
下面以基本定时器T0为例,说明初始值的设定方法。
T0C:T0累加计数寄存器,上电初始值为00H,可以软件重置,每次溢出之后,初
始值需要用户重置。初始值设定方法如下:
T0C初始值 = 256 – (T0溢出间隔时间 × 输入时钟)
T0C初始值 = 256 – (T0溢出间隔时间 × 输入时钟)
= 256 – ( 10ms × 1M/64 )
= 64H
T0M中的Bit6:Bit4决定分频数的比率,T0的时钟源来自CPU,通过T0M中的
Bit6,Bit5,Bit4来控制分频数的比率,T0ENB位控制计数器时钟,如果为1则时钟输入
到T0计数器T0C中,T0开始计数,否则T0C的时钟被切断,T0C停止计数。当T0C计
数器从0FFH增加到000H时,系统会将标志位T0IRQ置为1。
表3-1 T0M寄存器
例如:用T0做一个10ms的定时,Fcpu=1M。T0rate选择010(Fcpu/64),那么
0D8H
T0M
复位后
Bit7
0
Bit6
0
Bit5
0
Bit4
0
Bit3
-
-
Bit2
-
-
Bit1
-
-
Bit0
T0TB
0
T0ENB T0rate2 T0rate1 T0rate0
T0TB:RTC 时钟控制位。
0 = 禁止RTC;
1 = RTC 模式。
T0RATE[2:0]:T0 分频选择位。
T0ENB:T0 启动控制位。
0 = 禁止T0;
1 = 开启T0。
表3-2 分频比
T0rate2~T0rate0
000
001
010
分频比
Fcpu/256
Fcpu/128
Fcpu/64
011
100
101
110
111
注:在RTC 模式下,T0RATE 的设置是无效的。
5) 中断
Fcpu/32
Fcpu/16
Fcpu/8
Fcpu/4
Fcpu/2
SONIX单片机是当今世界上很有影响力的精简指令集微控器,具有丰富的中断功能。
不过它们也存在一定的局限性,例如中断矢量只有一个,并且各个中断源之间也没有优
先级别之分,不具备中断屏蔽功能。
不同的芯片具有不同的中断。SN8P2501B单片机具有3个中断源:2个部中断源(定
时器T0、定时/计数器TC0)、1个外部中断源(INT0/P00)。
对于SONIX单片机来说,中断源的要否会得到响应,受允许中断寄存器INTIEN中
各位的控制。在全局中断控制位GIE为1时,才能使能中断请求,当中断源同时产生中
断时,要靠部的查询逻辑来确定响应的次序,不同的中断源其中断地址均为0008H。一
次中断活动的全过程如图3-4所示。
执行一条指令(1)
有中断请求 ?
(2)
Yes
中断屏蔽(3)
No
中断响应(4)
保护(5)
调查中断源(6)
中断处理(7)
清除标志(8)
恢复现场(9)
中断返回(10)
图3-4 中断处理流程图
No
Yes
在图中,(1),(2),(3)和(9)是由硬件自动实现的,而其它的阶段是由用户软件完
成的。有中断请求发生并被响应后,程序转至0008H 执行中断子程序。响应中断之前,
必须保存ACC、PFLAG 的容。芯片提供PUSH 和POP 指令进行入栈保存和出栈恢复,从而
避免中断结束后可能的程序运行错误。
PUSH/POP指令仅对ACC和PFLAG作中断保护,而不包括NT0和NPD。某些芯片PUSH/POP
只能保护PFLAG寄存器的值,ACC的值需要用户自己保存,此芯片中PUSH/POP可直接对ACC
和PFLAG进行保护。PUSH/POP 缓存器是唯一的且仅有一层,因此只能出现在中断保护现
场中。
6) SN8P2501B单片机编译选项表
利用SN8P2501B芯片作为微控制器,在编译过程中需要注意对应的选项表,见表
3-3。
表3-3 SN8P2501B单片机编译选项表
编译选项
Noise_Filter
配置项目
Enable
Disable
Fhosc/1
Fhosc/2
功能说明
开启杂讯滤波功能,Fcpu = Fosc/4~Fosc/16
关闭杂讯滤波功能,Fcpu = Fosc/1~Fosc/16
指令周期 = 1个时钟周期,必须关闭杂讯滤波功能;
IHRC_16M 和IHRC_RTC 模式下,不支持Fosc/1
指令周期 = 2 个时钟周期,必须关闭杂讯滤波功能;
IHRC_16M 和IHRC_RTC 模式下,不支持Fosc/2
指令周期 = 4 个时钟周期
指令周期 = 8 个时钟周期
指令周期 = 16 个时钟周期
高速时钟采用部16MHz RC 振荡电路,XIN/XOUT
(P1.3/P1.2)作为普通的I/O 引脚;
IHRC_16M 模式下,Fcpu 取值在Fosc/4~Fosc/16 之间
高速时钟采用部16MHz RC 振荡电路,具有RTC 功能
(0.5sec),XIN/XOUT(P1.3/P1.2)作
为普通的I/O 引脚;
IHRC_RTC 模式下,Fcpu 取值在Fosc/4~Fosc/16 之间
外部高速时钟振荡器采用廉价的RC 振荡电路,XOUT(P1.2)
为普通的I/O 引脚
外部高速时钟振荡器采用低频、省电晶体/瓷振荡器(如
32.768KHz)
外部高速时钟振荡器采用高频晶体/瓷振荡器(如
10MHz~12MHz)
外部高速时钟振荡器采用标准晶体/瓷振荡器(如
1M~10MHz)
始终开启看门狗定时器,即使在睡眠模式和绿色模式下也
处于开启状态
开启看门狗定时器,但在睡眠模式和绿色模式下关闭
关闭看门狗定时器
使能外部复位引脚
P1.1 为单向输入引脚,无上拉电阻
VDD 低于2.0V 时,LVD 复位系统;
Fcpu
Fhosc/4
Fhosc/8
Fhosc/16
IHRC_16M
IHRC_RTC
High_Clk
RC
32K X’tal
12M X’tal
4M X’tal
Always_On
Watch_Dog
Enable
Disable
Reset_Pin
LVD
Reset
P11
LVD_L
LVD_M
LVD_H
Enable
Disable
注:
VDD 低于2.0V 时,LVD 复位系统;
PFLAG 寄存器的LVD24 位作为2.4V 低电压监测器
VDD 低于2.4V 时,LVD 复位系统;
PFLAG 寄存器的LVD36 位作为3.6V 低电压监测器
ROM 代码加密
ROM 代码不加密
Security
a) 在干扰严重的情况下,建议开启杂讯滤波功能,此时Fcpu = Fosc/4 ~ Fosc/16,
并将Watch_Dog 设置为“Always_On”;
b) 如果用户设置看门狗为“Always_On”,编译器将自动开启看门狗定时器;
c) 编译选项Fcpu 仅针对高速时钟,在低速模式下Fcpu = FILRC/4;
d) 在IHRC_16M 和IHRC_RTC 模式下,Fcpu = Fosc/4 ~ Fosc/16。
3.1.3 单片机复位电路
SN8P2501B 有以下几种复位方式:
a) 上电复位;
b) 看门狗复位;
c) 掉电复位;
d) 外部复位(仅在外部复位引脚处于使能状态)。
上述任一种复位发生时,所有的系统寄存器恢复默认状态,程序停止运行,同时程
序计数器PC 清零。复位结束后,系统从向量0000H 处重新开始运行。PFLAG 寄存器的
NT0 和NPD 两个标志位能够给出系统复位状态的信息。用户可以编程控制NT0 和NPD,
从而控制系统的运行路径。
表3-4 PFLAG寄存器
086H
PFLAG
读/写
复位后
Bit7
NT0
R/W
X
Bit6
NPD
R/W
X
Bit5
LVD36
R
0
Bit4
LVD24
R
0
Bit3
-
-
-
Bit2
C
R/W
0
Bit1
DC
R/W
0
Bit0
Z
R/W
0
NT0、NPD:复位状态标志
表3-5 复位状态标志复位情况
NT0
0
0
1
NPD
0
1
0
复位情况
看门狗复位
保留
上电及LVD复位
说明
看门狗溢出
-
电源电压低于LVD检测值
1 1 外部复位 外部复位引脚检测到低电平
任何一种复位情况都需要一定的响应时间,系统提供完善的复位流程以保证复位动
作的顺利进行。对于不同类型的振荡器,完成复位所需要的时间也不同。因此,VDD 的
上升速度和不同晶振的起振时间都不固定。RC 振荡器的起振时间最短,晶体振荡器的
起振时间则较长。在使用的过程中,应注意考虑主机对上电复位时间的要求。图3-5为
各种复位方式的响应。
图3-5 各种复位电路的响应
在这里所用的复位为外部复位。外部复位功能由编译选项“Reset_Pin”控制。将
该编译选项置为“Reset”,可使能外部复位功能。外部复位引脚为施密特触发结构,
低电平有效。复位引脚处于高电平时,系统正常运行。当复位引脚输入低电平信号时,
系统复位。外部复位操作在上电和正常工作模式时有效。需要注意的是,在系统上电完
成后,外部复位引脚必须输入高电平,否则系统将一直保持在复位状态。外部复位的时
序如下:
a) 外部复位(当且仅当外部复位引脚为使能状态):系统检测复位引脚的状态,如
果复位引脚不为高电平,则系统会一直保持在复位状态,直到外部复位结束;
b) 系统初始化:初始化所有的系统寄存器;
c) 振荡器开始工作:振荡器开始提供系统时钟;
d) 执行程序:上电结束,程序开始运行。
外部复位可以在上电过程中使系统复位。良好的外部复位电路可以保护系统以免进
入未知的工作状态。
外部复位电路有多种复位方式,如RC复位电路、二极管及RC复位电路等。
1) RC复位电路
如图3-6
图3-6 RC复位电路
图3-7为一个由电阻R1 和电容C1 组成的基本RC 复位电路,它在系统上电的过程中
能够为复位引脚提供一个缓慢上升的复位信号。这个复位信号的上升速度低于VDD 的上
电速度,为系统提供合理的复位时序,当复位引脚检测到高电平时,系统复位结束,进
入正常工作状态。
2) 二极管及RC复位电路
如图3-7
图3-7 二极管及RC复位电路
R1和C1同样是为复位引脚提供输入信号。对于电源异常情况,二极管正向导通使C1
快速放电并与VDD保持一致,避免复位引脚持续高电平、系统无常复位。
注:“基本RC 复位电路”和“二极管及RC 复位电路”中的电阻R2 都是必不可少
的限流电阻,以避免复位引脚ESD(Electrostatic Discharge)或EOS(Electrical
Over-stress)击穿 。
本设计电路比较简单,对复位响应时间没有太大的要求,考虑成本及电路规划的基
础上采用RC复位电路作为此MCU的复位电路。
3.1.4 单片机晶振电路
对于本芯片来说,主要有两种晶振来源:外部石英/瓷振荡器和部高速RC振荡器。
1) 外部石英/瓷振荡器
其电路图如图3-8
图3-8 外部石英/瓷振荡器
图3-9中,XIN/XOUT/VSS 引脚与石英/瓷振荡器以及电容C之间的距离越近越好。
2) 部高速RC振荡器
编译选项“IHRC_16M”和“IHRC_RTC”控制单片机的置RC高速时钟(16MHz)。若选
择“IHRC_16M”,则置16MHz RC振荡器作为系统时钟源,XIN和XOUT引脚作为通用I/O 口。
若选择“IHRC_RTC”,则系统时钟来自置16MHz RC振荡器,同时XIN 和XOUT 引脚与实
时时钟源(RTC)32768HZ石英晶体相连。
IHRC:系统高速时钟来自置16MHz RC振荡器,XIN/XOUT 引脚作为普通的I/O引脚。
IHRC_RTC:置16MHZ RC振荡器作为系统高速时钟,同时XIN 和XOUT 引脚与实时时
钟源(RTC)32768Hz石英晶体相连。RTC的周期为0.5 s,RTC 的定时器为T0。
本设计需要11个I/O口(6个LED控制位,4个步进电机控制位,1个输入信号位),
所选用的MCU资源刚刚满足需要,过程中不需要获取非常准确的时间,因此选用MCU置的
16MHz RC高速振荡器作为系统时钟源,XIN 和XOUT引脚作为通用I/O口。
3.1.5 微处理器控制电路
图3-9 控制电路
MCU所需电压在2.4V-5.5V围,在此选取典型电压5.0V;步进电机正常工作电压在12V
或24V,但考虑到步进电机在此处只带动红外感应模块,不需要比较大的动力,为了简
化电路,采用7.5V电压。这样只需要将通过电源适配器获得的7.5V电压转化成5.0V即可,
这里需要用到电压转换芯片7805。电路图如图3-10所示,其中C1/C2/C3/C4增强电源抗
干扰能力。
图3-10 电源电路
控制电路图如图3-9所示。图中,C5为0.1uF的电容,分别与MCU VDD 和VSS 相连,
可以增强MCU 抗干扰能力。Q5为PNP型8550三极管,它在这里只是起升压作用,升0.6V
左右电压,使之大于0.7VDD,满足MCU I/O口电平需求。U2为红外感应装置。红外感应
模块随着步进电机的旋转而旋转,将探测到得信号通过2口输送出来。当红外感应模块
检测到人时,2口输出高电平,通过Q5使MCU的P0.0口变为高电平;当红外感应模块未检
测到人时,2口输出低电平,MCU的P0.0口变为低电平,这样MCU就可以只检测P0.0的状
态就可以判断是否有人。
Q1-Q4为NPN型8050三极管,它在这里起开关功能。D7-D10为二极管1N4148,因为MCU
对应步进电机各口输出的电平一会儿是高电平,一会儿是低电平,相当于PWM信号,通
过步进电机线圈后会产生感应磁场,进而产生反电动势,产生回路电流,通过续流二极
管(D7-D10)而衰减掉,从而保护了Q1-Q4三极管。线圈两端分别为A、B、C、D,哪位
被驱动,步进电机旋转对应的角度,具体情况由程序控制。
当在设定时间(防止因干扰而造成开机),红外感应模块输出的电平一直是高电平,
此时就认为有人存在,打开LED模拟风扇旋转循环闪烁功能,步进电机开始工作。步进
电机带着红外感应装置开始正转,当红外感应模块在之前没有检测到有人及无人标志时
检测到有人存在,则记录此时步进电机步数X1(即角度);当红外感应模块在之前检测
到有人标志,但没有检测到无人标志时,检测到无人存在,记录此时步进电机步数X2(即
角度),在步进电机正转180°后,LED开始以X1-X2的方式循环闪烁,步进电机开始反
转180°,只有当步进电机再一次正转180°后,LED才会按照后来检测到的X1-X2循环闪
烁。当步进电机在正转180°中,红外感应模块始终没有检测到有人信号,则在步进电
机反转180°后关闭LED模拟风扇旋转循环闪烁功能,并关闭步进电机。
3.2 步进电机
3.2.1 步进电机工作原理
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况
下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影
响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步
进电机只有周期性的单步误差和累积误差等特点。使得在速度、位置等控制领域用步进
电机来控制变的非常的简单。虽然步进电机已被广泛地应用,但步进电机并不能象普通
的直流电机、交流电机在常规下使用。步进电机必须由双环形脉冲信号、功率驱动电路
等组成控制系统方可使用。
1) 反应式步进电机原理
下面以三相反应式步进电机来介绍反应式步进电机的原理。
a) 结构:
电机转子均匀分布着很多小齿,定子齿有三个励磁绕阻,其几何轴线依次分别与转
子齿轴线错开。 0T、1/3T、2/3T,(相邻两转子齿轴线间的距离为齿距以T表示),即
A与齿1相对齐,B与齿2向右错开1/3T,C与齿3向右错开2/3T,A'与齿5相对齐,
(A'就是A,齿5就是齿1)图3-11为定转子的展开图:
图3-11 定转子的展开图
b) 旋转:
若A相通电,B,C相不通电时,由于磁场作用,齿1与A对齐,(转子不受任何
力以下均同)。
若B相通电,A,C相不通电时,齿2应与B对齐,此时转子向右移过1/3T,此时
齿3与C偏移为1/3T,齿4与A偏移(T-1/3T)=2/3T。
若C相通电,A,B相不通电,齿3应与C对齐,此时转子又向右移过1/3T,此时
齿4与A偏移为1/3T对齐。
若A相通电,B,C相不通电,齿4与A对齐,转子又向右移过1/3T 这样经过A、
B、C、A分别通电状态,齿4(即齿1前一齿)移到A相,电机转子向右转过一个齿距,
如果不断地按A,B,C,A……通电,电机就每步(每脉冲)1/3T,向右旋转。如按C,B,
A,C……通电,电机就反转。
由此可见:电机的位置和速度由导电次数(脉冲数)和频率成一一对应关系。而方
向由导电顺序决定。 不过,出于对力矩、平稳、噪音及减少角度等方面考虑。往往采
用A-AB-B-BC-C-CA-A这种导电状态,这样将原来每步1/3T改变为1/6T。甚至于通过
二相电流不同的组合,使其1/3T变为1/12T,1/24T,这就是电机细分驱动的基本理论
依据。
不难推出:电机定子上有m相励磁绕阻,其轴线分别与转子齿轴线偏移
1/m,2/m……(m-1)/m,1。并且导电按一定的相序电机就能正反转被控制——这是步进电
机旋转的物理条件。
c) 力矩:
电机一旦通电,在定转子间将产生磁场(磁通量Ф),如图3-12:
图3-12 定转子通电产生磁场
当转子与定子错开一定角度产生力,F与(dФ/dθ)成正比
磁通量
Ф=Br * S(Br为磁密,S为导磁面积)
(3-1)
F与L*D*Br成正比(L为铁芯有效长度,D为转子直径,Br=N·I/R);
N·I为励磁绕阻安匝数(电流乘匝数),R为磁阻;
力矩=力*半径;
可以得到力矩与电机有效体积*安匝数*磁密成正比(只考虑线性状态),因此,电
机有效体积越大,励磁安匝数越大,定转子间气隙越小,电机力矩越大,反之亦然
2) 永磁感应子式步进电机原理
下面以四相感应子式步进电机为例来介绍永磁感应子式步进电机原理。
四相电机工作原理:电机定子有四个励磁绕阻,转子均匀分布着很多小齿,并加有
永磁体使转子轴向分布若干对N-S齿极,且N、S齿极互相错开1/2T(T为相邻两转子齿
轴线间的距离,即齿距)。定转子齿几何轴线依次向左错开:0、1/4T、2/4T、3/4T。以
下为四相电机定、转子展开后的工作原理图(见图3-13)。
图3-13 四相电机工作原理图
以四相单四拍即A—B—C—D—A通电方式,转子不受外力为例。 第一拍:当A相
通正向电流(如图3-13示电流方向),B、C、D相不通电时,有工作原理图可看出,定
子A极产生S极磁场,由于磁场作用,转子N1齿将与定子A极轴线与相对齐,而N2齿
与B极,N3齿与C极,N4齿与D极,N5齿与A极的轴线以次向右错开1/4T, 2/4T, 3/4T,1T。
第二拍:当B相通正向电流,A、C、D相不通电时,N2齿将于B极轴线相对齐,此
时转子向右转过1/4T,而N3齿与C极,N4齿与D极,N5齿与A极轴线以次向右错开
1/4T, 2/4T, 3/4T。
同理,第三拍C相通正向电流,转子又向右转过1/4T。第四拍D相通正向电流,D
与N4相对齐,转子再次向右转过1/4T,N5齿与A极轴线向右错开1/4T。
当再到A相通正向电流时,N5齿与A极轴线相对齐,至此转子转过一个齿距T,如
果不断地按A-B-C-D-A…通电,电机就按每步(每脉冲)1/4T向右连续旋转。如按
A-D-C-B-A……通电,电机则反转。
如果通的不是正向电流而是反向电流,定子产生的不是S极而是N极,每相通电时
对应的S齿与其轴线相对齐,旋转的方向不变。
感应子式步进电机某种程度上可以看作是低速同步电机。一个四相电机可以作四相
运行,也可以作二相运行。(必须采用双极电压驱动),而反应式电机则不能如此。例如:
四相,八相运行(A-AB-B-BC-C-CD-D-DA-A)完全可以采用二相八拍运行方式.不难发现
其条件为C=A ,D=B . 一个二相电机的部绕组与四相电机完全一致,小功率电机一般直
接接为二相,而功率大一点的电机,为了方便使用,灵活改变电机的动态特点,往往将
其外部接线为八根引线(四相),这样使用时,既可以作四相电机使用,更可以作二相
电机绕组串联或并联使用,灵活的改变电机的性能。
感应子式步进电机与传统的反应式步进电机相比,结构上转子加有永磁体,以提供
软磁材料的工作点,而定子激磁只需提供变化的磁场而不必提供磁材料工作点的耗能,
因此该电机效率高,电流小,发热低。因永磁体的存在,该电机具有较强的反电势,其
自身阻尼作用比较好,使其在运转过程中比较平稳、噪音低、低频振动小。
感应子式步进电机以相数可分为:二相电机、三相电机、四相电机、五相电机等。
以机座号(电机外径)可分为:42BYG(BYG为感应子式步进电机代号)、57BYG、86BYG、
110BYG(国际标准),而像70BYG、90BYG、130BYG等均为国标准。
3.2.2 步进电机的静态指标术语
相数:产生不同对极N、S磁场的激磁线圈对数。常用m表示。
拍数:完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一
个齿距角所需脉冲数,以四相电机为例,有四相四拍运行方式即AB-BC-CD-DA-AB,四
相八拍运行方式即 A-AB-B-BC-C-CD-D-DA-A。
步距角:对应一个脉冲信号,电机转子转过的角位移用θ表示。θ=360度(转子
齿数J*运行拍数),以常规二、四相,转子齿为50齿电机为例。四拍运行时步距角为
θ=360度/(50*4)=1.8度(俗称整步),八拍运行时步距角为θ=360度/(50*8)=0.9
度(俗称半步)。
定位转矩:电机在不通电状态下,电机转子自身的锁定力矩(由磁场齿形的谐波以
及机械误差造成的)。
静转矩:电机在额定静态电作用下,电机不作旋转运动时,电机转轴的锁定力矩。
此力矩是衡量电机体积(几何尺寸)的标准,与驱动电压及驱动电源等无关。
3.2.3 步进电机的动态指标术语
单步误差:步进电机每转过一个步距角的实际值与理论值的误差称之为单步误差。
用百分比表示:误差值/步距角*100%。不同的细分驱动器和不同的细分数其值不同。
累积误差:步进电机转过的实际角度值与理论值的最大误差称之为累积误差,其值
为单步误差值的总和的最大值。以具体角度值表示。它比单步误差更为重要。
失步:电机运转时运转的步数,不等于理论上的步数,称之为失步。
失调角:转子齿轴线偏移定子齿轴线的角度,电机运转必存在失调角,由失调角产
生的误差,采用细分驱动是不能解决的。
最大空载起动频率:电机在某种驱动形式、电压及额定电流下,在不加负载的情况
下,能够直接起动的最大频率。
最大空载的运行频率:电机在某种驱动形式,电压及额定电流下,电机不带负载的
最高转速频率。
3.2.4 PM35L-048步进电机介绍
红外感应模块需要在步进马达的带动下去检测人围,因此对步进马达的要求比较
高,尽量选择永磁感应式步进电机,步进电机每步旋转角度不能太大,也不能太小。角
度太大会造成锁定人围的误差较大;角度太小会导致判断围所需时间太长。综合考虑后
本设计选用PM35L-048永磁感应四相式步进电机,采用四相八拍法来带动红外感应模
块。PM35L-048永磁感应四相式步进电机,步矩角为7.5°,相数为4, 因此电机一步
旋转角度为7.5°。
其参考特性入表3-5所示
表3-5 PM35L-048参考特性
参考特性
电机尺寸
每旋转步数
驱动方式
驱动电路
驱动电压
电流/相
线圈电阻/期
驱动IC
永磁材料
绝缘电阻
电介质强度
绝缘等级
工作温度
储存温度
经营坎
24V
30欧姆
25C3346
PM35L-048
48(7.5°/1步)
2-2相
Unipolar Bipolar Chopper
24V
500mA
5.5欧姆
UDN29168-V
铁氧体磁铁塑胶(MSPL)
极地各项异性铁氧体烧结磁体(MS50)
铷铁硼磁铁粘结(MS70)
最小电阻100M欧姆
最小交流电压500V
E类
-10°C--50°C
-30°C--80°C
相对湿度20%--90%
其电路图为
图3-14 步进电机电路
D7-D10起保护三极管功能,因为输出的信号是PWM信号,经过步进电机后,电机
部的磁场会产生反电动势,使NPN的集电极电压增大,通过D7-D10除去反电动势,保
护三极管。
3.3 红外感应模块
3.3.1 红外感应装置的工作原理
人体都有恒定的体温,一般在37°,会发射10um左右的特定波长红外线,用专门的
热释电红外传感器(PIR)就可以针对性的检测这种红外线的存在与否,当人体红外线照
射到传感器上后,因热释电效应将向外释放电荷,后续电路经检测处理后就能产生控制
信号。这种专门设计的探头只对波长为10μm左右的红外辐射敏感,所以除人体以外的
其他物体不会引发探头动作。探头包含两个互相串联或并联的热释电元,而且制成的两
个电极化方向正好相反,环境背景辐射对两个热释元件几乎具有相同的作用,使其产生
释电效应相互抵消,于是探测器无信号输出。一旦人侵入探测区域,人体红外辐射通过
部分镜面聚焦,并被热释电元接收,但是两片热释电元接收到的热量不同,热释电也不
同,不能抵消,于是输出检测信号。
为了增强敏感性并降低白光干扰,通常在探头的辐射照面覆盖有特殊的菲泥尔滤光
透镜,菲泥尔透镜有两种形式,即折射式和反射式。菲泥尔透镜作用有两个:一是聚用,
即将热释的红外信号折射(反射)在PIR上,第二个作用是将警戒区分为若干个明区和
暗区,使进入警戒区的移动物体能以温度变化的形式在PIR上产生变化热释红外信号,
这样PIR就能产生变化的电信号。
3.3.2 BISS0001红外感应信号处理器
BISS0001是一款高性能的传感信号处理集成电路。静态电流极小,配以热释电红
外传感器和少量外围元器件即可构成被动式的热释电红外传感器。
特点:
CMOS数模混合专用集成电路;
具有独立的高输入阻抗运算放大器;
部的双向鉴幅器可有效抑制干扰;
设延迟时间定时器和封锁时间定时器,调节围;
工作电压围为+3V~+5V ;
图3-15 BISS0001管脚图
表3-6 引脚说明
引脚 名称
1 A
I/O
I
功能说明
可重复触发和不可重复触发选择端。当A为“1”时,允许重复触
发;反之,不可重复触发
控制信号输出端。由VS的上跳前沿触发,使Vo输出从低电平跳
变到高电平时视为有效触发。在输出延迟时间Tx之外和无VS的
上跳变时,Vo保持低电平状态。
输出延迟时间Tx的调节端
输出延迟时间Tx的调节端
触发封锁时间Ti的调节端
2
3
4
5
V0
RR1
RC1
RC2
O
--
--
--
6
7
8
9
10
11
12
13
14
15
16
RR2
VSS
VRF
VC
IB
VDD
2OUT
2IN-
1IN+
1IN-
1OUT
--
--
I
I
--
--
O
I
I
I
O
触发封锁时间Ti的调节端
工作电源负端
参考电压及复位输入端。通常接VDD,当接“0”时可使定时器复
位
触发禁止端。当VC>VR时允许触发(VR≈0.2VDD)
运算放大器偏置电流设置端
工作电源正端
第二级运算放大器的输出端
第二级运算放大器的反相输入端
第一级运算放大器的同相输入端
第一级运算放大器的反相输入端
第一级运算放大器的输出端
图3-16 BISS0001部框图
BISS0001是由运算放大器、电压比较器、状态控制器、延迟时间定时器以及封锁
时间定时器等构成的数模混合专用集成电路。
表3-7 BISS0001直流特性参数
符号
V
D0
I
D0
参数
电压工作围
工作电流
测试条件
--
V
D0
=3V
无负载
V
D0
=5V
最小值
3V
--
--
最大值
5V
50uA
100uA
V
OS
I
OS
Avo
CMRR
V
YH
V
YL
V
RH
V
RL
V
CH
V
CL
V
AH
V
AL
输入失调电压
输入失调电流
开环电压增益
共模抑制比
运放输出高电平
运放输出低电平
Vc端输入高电平
Vc端输入低电平
Vo端输出高电平
Vo端输出低电平
A端输入高电平
A端输入低电平
V
D0
=5V
V
D0
=5V
V
D0
=5V,R
L
=1.5M
V
D0
=5V,R
L
=1.5M
V
D0
=5V
R
L
=500K接1/2 V
D0
V
RF
= V
D0
=5V
V
D0
=5V,I
CH
=0.5mA
V
D0
=5V,I
CH
=0.1mA
V
D0
=5V
V
D0
=5V
--
--
60dB
60dB
4.25V
--
1.1V
--
4V
--
3.5V
--
50mV
50nA
--
--
--
0.75V
--
0.9V
--
0.4V
--
1.5V
以下图所示的不可重复触发工作方式下的波形,来说明其工作过程。
图3-17 不可重复触发工作方式
首先,根据实际需要,利用运算放大器OP1组成传感信号预处理电路,将信号放大。
然后耦合给运算放大器OP2,再进行第二级放大,同时将直流电位抬高为VM(≈0.5VDD)
后,将输出信号V2送到由比较器COP1和COP2组成的双向鉴幅器,检出有效触发信号
Vs。由于V
H
≈0.7VDD、
VL
≈0.3VDD,所以,当VDD=5V时,可有效抑制±1V的噪声干扰,
提高系统的可靠性。COP3是一个条件比较器。当输入电压V
C
>V
R
时,COP3输出为高电平,
进入延时周期。当A端接“0”电平时,在Tx时间任何V2的变化都被忽略,直至Tx时
间结束,即所谓不可重复触发工作方式。当Tx时间结束时,Vo下跳回低电平,同时启
动封锁时间定时器而进入封锁周期Ti。在Ti时间,任何V2的变化都不能使Vo跳变为
有效状态(高电平),可有效抑制负载切换过程中产生的各种干扰。
以下图所示的可重复触发工作方式下的波形,来说明其工作过程。
图3-18 可重复触发工作方式
可重复触发工作方式下的波形在V
C
=“0”、A=“0”期间,信号Vs不能触发Vo为
有效状态。在V
C
=“1”、A=“1”时,Vs可重复触发Vo为有效状态,并可促使Vo在Tx
周期一直保持有效状态。在Tx时间,只要Vs发生上跳变,则Vo将从Vs上跳变时刻起
继续延长一个Tx周期;若Vs保持为“1”状态,则Vo一直保持有效状态;若Vs保持
为“0”状态,则在Tx周期结束后Vo恢复为无效状态,并且,同样在封锁时间Ti时间,
任何Vs的变化都不能触发Vo为有效状态。
图3-19 BISS0001应用电路图
上图中,运算放大器OP1将热释电红外传感器的输出信号作第一级放大,然后由
C3耦合给运算放大器OP2进行第二级放大,再经由电压比较器COP1和COP2构成的双
向鉴幅器处理后,检出有效触发信号Vs去启动延迟时间定时器,输出信号Vo经晶体管
T1放大驱动继电器去接通负载。
R3为光敏电阻,用来检测环境照度。当作为照明控制时,若环境较明亮,R3的电
阻值会降低,使9脚的输入保持为低电平,从而封锁触发信号Vs。SW1是工作方式选择
开关,当SW1与1端连通时,芯片处于可重复触发工作方式;当SW1与2端连通时,芯
片则处于不可重复触发工作方式。输出延迟时间Tx由外部的R9和C7的大小调整,值
为Tx≈24576*R9*C7;触发封锁时间Ti由外部的R10和C6的大小调整,值为
Ti≈24*R10*C6。
3.3.4 红外感应装置输出电平转换
利用红外感应装置获得的输入电平为0V或3.3V,而MCU I/O可识别的高电压
为>0.7VDD,即3.5V,显然不能直接将3.3V获得的电压直接送给MCU,需要利用转化电
路将其转换为MCU可正确读取的电平信号。下面是几种自己在设计中考虑过的电平转换
电路。
图3-20 PNP转换电平
利用这种方法是将从红外感应装置中获取的信号升0.6V左右电压,这样,通过PNP
型三极管后获得的电压为0.6V或3.9V,满足MCU I/O口可识别的电平电压。
缺点:这种方法只适合用于通过提升小电压(0.6V左右)即可满足条件的电路。
图3-21 NPN转换电平
在这种方法中,NPN型三极管起开关作用。当输出口2为低电平(0V)时,三极管
不导通,MCU I/O口获得5V的高电平;当输出口2为高电平时,三极管导通,MCU I/O
口获得0V的低电平。
缺点:在本设计中,红外模块在检测到有人时输出高电平(3.3V)信号,经过NPN
开关三极管后,MCU获得低电平信号,即2口为高电平,I/O对应口为低电平时说明检
测到人,容易电平搞混淆。
在考虑到现有资源及成本的情况下,选取PNP电平转换方法。
4 软件设计
程序设计的总体思想是模块化设计,即将程序划分为三层结构:应用层、介面层和
底层驱动程序。如图4-1所示。
底层驱动层主要包含直接和硬件相关的驱动程序,如LED闪烁、按键,蜂鸣器,继
电器和电机控制等。底层的各模块间要保持各自的独立性,不产生直接的数据交互,底
层也不直接访问应用层,如果需要,都要通过介面层进行数据交互。
介面层主要提供数据交互,为应用层和底层驱动之间以及底层驱动层各模块之间提
供数据的交互。
应用层主要是完成具体功能的实现,它要通过介面层控制底层驱动层各模块来完成
所需功能,而不能越过介面层直接访问底层驱动层。所有的用户接口要在应用层来实现。
应用层
应用层
介面层
数据交互
底层驱动层
红外感应
发光二极管闪烁 电机控制 ......
图4-1 软件结构图
4.1 主程序设计
主程序实现的功能是:完成步进电机的控制,实现自动扫描人数围、发光二极管模
拟风扇旋转循环闪烁等。它通过介面层控制底层驱动层各模块来实现所需功能,而不能
越过界面层直接访问底层驱动层。所有的用户接口都要在应用层来实现。
a) 堆栈指针
SN8P2501B的堆栈缓存器共有四层,程序进入中段或执行CALL指令时,用来存储
程序寄存器PC的值,寄存器STKP为堆栈指针,指向堆栈缓存器顶层。系统复位时,堆
栈指针寄存器容为默认值,建议用软件再将默认值7FH送进STKP以确保开始时堆栈指
针处于栈顶。
b) RAM初始化
一个完整的用户自定义寄存器初始化动作或清零动作是非常重要的,否则容易造成
程序执行的不确定性,甚至会导致程序出现跑飞现象。当程序上电复位时,RAM区各寄
存器存放的数值是随机存储的。为确保程序的正确运行,需要对用户定义的寄存器进行
初始化清零动作。
c) 系统寄存器初始化
系统寄存器也必须进行初始化。系统初始化包括对外部振荡器、I/O口方向和输出
电平,定时计数器的初始化等。本设计中各模块均需要通过I/O口和MCU打交道,故需
要对其进行初始化。值得强调的是在设计中没有用到的I/O口最好设置成输入上拉模
式,以防电平干扰。同时,也要将定时器在初始化程序中设置,以让它按设置好的时间
产生中断并处理。
对于本设计程序而言,采用的计时方式是只判断中断请求标志位,而不让其进入中
断服务程序中处理,这样可以减少程序指令,节省ROM空间。
d) 预处理
在程序中有些寄存器需要初值,这些就要在预处理中处理。正确的初值会使程序跑
的准确,相反,忘记赋初值或赋了不正确的初值,就有可能使程序执行不准确甚至不能
实现相应的功能。
e) 看门狗复位
看门狗定时器WDT用于监控程序的正常执行,如果由于干扰,程序进入未知状态,
看门狗定时器溢出,系统进行复位,因此在主程序每一次开始时,需要对看门狗寄存器
复位,以防止程序运行中出现死循环。SONIX 有专门针对看门狗复位的宏:RST_WTD。
f) 调用子程序
本设计主要的功能在子程序中实现,所以,主程序中需要循环调用各子模块。子模
块分别为:分时时间处理模块,步进电机旋转模块,APP模块,LED模拟闪烁模块
主程序流程图如下:
开始
初始化
(系统初始化和预
处理)
清看门狗
分时时间处理
步进电机转动处理
APP事件处理
发光二极管循环点
亮事件处理
结束
图4.2 主程序流程图
4.2 分时时间处理
分时时间处理就是对程序中用到的时间进行统一处理,有两个时间基准:一个是由
TC0产生的50ms时基;一个是由50ms生成的1秒作为时基。具体需要操作的时间有:开机
启动时间15秒、步进电机每步间隔时间5秒、LED循环闪烁时间300ms。其流程图为:
开始
有TC0中断请求
(50ms)?
yes
500msLED闪烁
时间到了?
yes
2.5s(步进电机
1拍间隔时间)
到了?
yes
no
no
no
1s时间到了?
yes
no
15s开机时间到
了?
yes
结束
no
图4-3 分时时间处理流程图
4.3 步进电机转动处理
步进电机转动处理主要就是实现步进电机按照某一频率旋转。在这里,步进电机需
要按照频率为5秒(红外感应模块延时时间为10秒)的速度来实现正反旋转(正:
A-AB-B-BC-C-CD-D-DA;反:D-DC-C-CB-B-BA-A-AD)。
流程图为:
开始
是否为开机状
态?
yes
每拍间隔时间
是否到了?
yes
no
no
是正转吗?
yes
按A-AB-B-BC-C-
CD-D-DA转动
no
按D-DC-C-CB-B-
BA-A-AD转动
结束
图4-4 步进电机旋转处理流程图
4.4 APP事件处理
APP事件处理主要是用来处理要实现的功能,也就是前面所说的应用层,所有的数
据都在这里进行处理。在这里主要是根据红外感应模块的检测情况处理动作,其流程图
为:
开始
是否检测
no
yes
no
是否是正转
yes
是否有人
no
yes
旋转到180°?
yes
no
yes
是否曾经有无
人信号
no
是否曾经有游
人信号
no
yes
反转
no
正转?
yes
是否曾经有有
人信号
no
是否曾经有无
人信号
no
yes
yes
是否曾有有人
信号
no
yes
记录此时步进电机
步数=Rwk02
记录此时步进电机
步数+1=Rwk01
关机
步进电机步数处理
返回
图4-5 APP处理流程图
4.5 LED循环闪烁
LED循环闪烁是用来模拟电风扇旋转的。在开始的正转180°,LED依次循环点亮;
正转结束后,LED按照记录的人的位置来循环点亮,循环间隔300ms。其流程图为:
开始
LED是否点亮
no
yes
点亮Rwk02对应
LED
500ms是否到
yes
no
Rwk02+1
Rwk02=Rwk01?
yes
no
Rwk02<=R_led1
结束
图4-6 LED闪烁流程图
5 结论
本设计的目标就是利用LED模拟实现电风扇旋转位置智能化,自然而然就要用到红
外探测器来侦测目标,在网上搜索有关信息,发现有能够只检测人的红外感应模块装置,
符合设计需要,并使设计过程简单化,排除了其他红外的干扰。在这里步进电机带动红
外感应模块做搜寻的动作,这样就把探测角度问题转化成步进电机旋转所走步数问题。
因为模拟角度有限,每个LED灯代表30°,因此人的围也以30°来递增。
起初采用方案一操作时,没有考虑遮掩其探测角度,导致在用LED模拟时只能模拟
出自动开关机动作,而人所在位置判断的结果误差很大,思考分析原因后,就想到了方
案二,利用方案二模拟功能,可以无需考虑其他因素,比较准确的模拟出当前人所在位
置,不过需要旋转360°,对于目前使用的探头模拟的,时间相对比较长,且会对绕线
产生影响,要解决这些问题,需要定做延时时间比较短的红外感应模块,正转360°后
需要反转360°,对于这种演示实物来说成本太大。因此就把目光又转移到方案一上,
不过这次添加了防红外的材料,降低探头的探测角度,将误差缩小化,分析发现,当探
头的探测角度小于步进电机两步所走角度(即15°)时,即可准确探测(前提是锁定人
围是以30°来递增的)。
本设计有几个地方实现比较困难,例如红外感应模块是可以调节延时时间的长短
的,但是如果时间过短,会使输出的信号失真,就只能当作开关使用;另外步进电机的
旋转速率其实也是由红外感应模块的延时时间决定的,在延时时间为10秒左右时,理论
上步进电机的旋转速度为每步2.5秒左右即可实现准确检测,事实上并不是这样,因为
红外感应信号处理器设有锁定时间,在大量测试后得出步进电机为每步5秒左右时才能
够正确判断人所在位置。
经过多次测试验证,LED可按照实际的人位置来循环点亮,各种预定功能均可以实
现,显然实现了此次设计的目的。如果时间充足的话,还可以在此设计基础上加入模拟
自动调风、定时及照明等功能,从而实现电风扇的智能化。
致
浑然不觉大学已过了三年,我们也走到了要跟大学说再见的时候,回望三年大学生
涯,酸甜苦辣各种滋味充实着生活,使自己在人生的道路上学会面对,学会坚强。借此,
向关心支持我的家人,老师,朋友们致以真诚的意,感你们这些年对我的关心和帮助,
感你们在我沮丧时给我鼓舞,你们在我无助的时候默默的支持我;同样感那些曾帮助过
我的陌生人,你们。
毕业设计的撰写,并不仅仅是我们交给老师,交给学校的最后一份作业,也是我们
检验自己大学三年所学知识及对自己以后人生发展具有很重要意义的一份报告。在毕业
设计全过程中,得到了系上老师的。如果不是你们,这个实物是不会顺利完成的,当发
现电路图可能出现问题,是你们和我一起搭板子测试功能的正确性,排除问题及提出新
的方案。在这里,我真诚的感你们。
感我在学校的毕业设计指导老师书凯老师,论文上的每一部分,都和你的帮助及支
持分不开的,虽然你不能直接给我指导,但是通过网络和手机随时了解我的进展情况及
遇到的问题,在开题报告和毕业设计编写期间,你无私的为我审阅,并提出宝贵的意见。
感我的舍友及大学的每一位同学,感你们在人生最重要的三年中陪我一起愉快地走
过,是你们在我失败时鼓励我,在我骄傲时提醒我,在我彷徨时安慰我,在我前进时支
持我。我把最诚挚的意送给你们,同时也希望你们再接再厉,为了明天,加油!
祝大家前途似锦,一帆风顺。
参 考 文 献
[1] 玉杰.松翰SN8P2700系列单片机原理及应用技术[M].:航空航天大学,2007.
[2] 松翰 SN8P2501B Datasheet[R].:松翰科技,2006.
[3] 钱云,汤勇明,涵春.电子器件[D].2006年02期.
[4] 程德福,林君.智能仪器[M].:机械工业,2005.
[5] BISS0001 Datasheet[R].:商思达电子,2007.
[6] 严长城.一种智能电风扇[P].中国专利:201377448,2010-1-6.
[7] 詹勳鸿.智慧型电风扇[D].:北科学技术学院,2008.
[8] 林敏.计算机控制技术及工程应用[M].:国防工业,2005.
[9] 何立民.单片机高级教程应用与设计[M].:航空航天大学,1997.
[10]
[11]
[12]
[13]
丁建军,定方,周国柱.基于AT89C51的智能电风扇控制系统[N].工学院学报,
昔华,王延川.电风扇智能控制模块的设计[N].渝州大学学报(自然科学版),
沙占友.集成化智能传感器原理及应用[M].:电子工业,2004.
康华光.电子技术基础数字部分(第四版) [M].高等教育,2002.
2003-2.
2000-2.
附录Ⅰ 系统原理图
图Ⅰ-1 系统原理图
附录Ⅱ 程序代码
软件程序代码:
CHIP
SN8P2501B
LVD_H ; 2.4V Reset Enable LVD36 bit of PFLAG for
//{{SONIX_CODE_OPTION
.Code_Option LVD
3.6V Low Voltage Indicator
.Code_Option Reset_Pin P11
.Code_Option Watch_Dog Always_On
.Code_Option High_Clk IHRC_16M ; Internal 16M RC Oscillator
.Code_Option Fcpu #7 ; Fcpu = Fosc/16
.Code_Option Security Enable
.Code_Option Noise_Filter Enable
//}}SONIX_CODE_OPTION
.NOLIST
INCLUDESTD MACRO1.H
INCLUDESTD MACRO2.H
INCLUDESTD MACRO3.H
;;SONIX 宏
.LIST
.DATA
INCLUDE
INCLUDE
ORG 00H
jmp reset
ORG 09H
mov
call
call
bset
a, #7fh
;;clear stack
FengShan_2501b_
FengShan_2501b_
.CONST
.CODE
reset:
mov stkp, a
sys_init
sys_premain
Fgie
//主程序
main:
rst_wdt
Call sys_intgnd
Call motor
Call app
Call led_show
jmp main
ENDP
//用户自定义RAM
sys_ram:
flag0 DS 1
Fled EQU flag0.0
Fstep EQU flag0.1
FopenPM EQU flag0.2
Fdirection EQU flag0.3
Ffirst EQU flag0.4
Fset1 EQU flag0.5
F4step EQU flag0.6
Fset EQU flag0.7
R_300ms DS 1
R_1s DS 1
R_2500ms DS 1
R_15s DS 1
stepcnt DS 1
ledcnt DS 1
R_led0 DS 1
R_led1 DS 1
Rwk00 DS 1
Rwk01 DS 1
Rwk02 DS 1
//用户自定义常量
sys_equ:
L_50ms EQU 3CH
L_300ms EQU 6
L_2500ms EQU 50
;;100msled显示标志位
;;步进电机一拍所用时间标志位
;;电机工作标志位
;;电机工作方向标志位
;;开机开始计时标志位
;;开始有人标志位
;;走完4步结束标志位
;;开始没人标志位
;;4步计数
;;led显示计数
;;暂时存放无人时的位置
;;暂时存放有人时的位置
;;电机走?个4步
;;存放没人时的位置
;;存放有人时的位置
时基
;;300ms时间,50ms为时基
;;2.5s时间,50ms为时基
;;50ms
L_1s EQU 20
L_15s EQU 15
Step_D EQU p1.3
Step_C EQU p1.2
Step_B EQU p5.4
Step_A EQU p1.0
//系统初始化
sys_init:
sys_init_oscm:
clr oscm
sys_init_ram:
b0mov y, #00h
b0mov z, #2fh
sys_init_ram10:
clr yz
decms z
jmp sys_init_ram10
clr yz
sys_init_tc0:
b0bclr ftc0irq
b0bclr ftc0ien
mov_ tc0c, #L_50ms
mov tc0r, a
mov a,#10000100b
mov tc0m, a
sys_init_io:
b0bclr p0m.0
mov a, #00001101b
b0mov p1m, a
b0mov p1ur,a
clr p0
clr p1
clr p2
clr p5
mov a, #0ffh
;;1s时间,50ms为时基
;;15s时间,1s为时基
;;work in normal mode
;;Fcpu/256,使能tc0,自动装载
b0mov p2m, a
b0mov p5m, a
b0mov p5ur, a
ret
sys_init90:
//程序预处理
sys_premain:
mov_
mov_
ret
R_1s, #L_1s
Rwk01, #7
//分时时间处理
sys_intgnd:
bts1
jmp
bclr
call
call
jmp
mov_
call
ret
mov a, R_300ms
cmprs a, #00h
decms R_300ms
jmp
mov_
bset
ret
mov a, R_2500ms
cmprs a, #00h
timechat0_90
R_300ms, #L_300ms
Fled
Ftc0irq
Ftc0irq
timechat0
timechat1
sys_intgnd90
decms R_1s
sys_intgnd90
R_1s, #L_1s
timechat2
sys_intgnd90:
timechat0:
timechat0_90:
timechat1:
decms R_2500ms
jmp timechat1_90
mov_ R_2500ms, #L_2500ms
bset Fstep
timechat1_90:
ret
timechat2:
bts0 FopenPM
jmp timechat2_90
bts1 FP00
jmp timechat2_10
bts0 Ffirst
jmp $+3
mov_ R_15s, #L_15s
bset Ffirst
mov a, R_15s
decms R_15s
jmp timechat2_90
bset FopenPM
mov_ R_2500ms, #L_2500ms
mov_ R_300ms, #L_300ms
timechat2_10:
bclr Ffirst
timechat2_90:
ret
//步进电机工作处理
motor:
bts1 FopenPM
jmp motor90
bts1 Fstep
jmp motor90
bclr Fstep
b0mov a, stepcnt
bts0 Fdirection
jmp motor20
;;是否第一次
循环闪烁
;;反转
;;led
motor10:
jmp_a 8
jmp motor10_10
jmp motor10_20
jmp motor10_30
jmp motor10_40
jmp motor10_50
jmp motor10_60
jmp motor10_70
jmp motor10_80
motor10_10:
bset Step_A
bclr Step_B
bclr Step_C
bclr Step_D
jmp motor10_100
motor10_20:
bset Step_A
bset Step_B
bclr Step_C
bclr Step_D
jmp motor10_100
motor10_30:
bclr Step_A
bset Step_B
bclr Step_C
bclr Step_D
jmp motor10_100
motor10_40:
bclr Step_A
bset Step_B
bset Step_C
bclr Step_D
jmp motor10_100
motor10_50:
;;A
;;AB
;;B
;;BC
bclr Step_A
bclr Step_B
bset Step_C
bclr Step_D
jmp motor10_100
motor10_60:
bclr Step_A
bclr Step_B
bset Step_C
bset Step_D
jmp motor10_100
motor10_70:
bclr Step_A
bclr Step_B
bclr Step_C
bset Step_D
jmp motor10_100
motor10_80:
bset Step_A
bclr Step_B
bclr Step_C
bset Step_D
motor10_100:
incms stepcnt
mov a, stepcnt
cmprs a, #08h
jmp motor90
clr stepcnt
bset F4step
jmp motor90
motor20:
jmp_a 8
jmp motor20_10
jmp motor20_20
jmp motor20_30
;;C
;;CD
;;D
;;DA
jmp motor20_40
jmp motor20_50
jmp motor20_60
jmp motor20_70
jmp motor20_80
motor20_10:
bclr Step_A
bclr Step_B
bclr Step_C
bset Step_D
jmp motor10_100
motor20_20:
bclr Step_A
bclr Step_B
bset Step_C
bset Step_D
jmp motor10_100
motor20_30:
bclr Step_A
bclr Step_B
bset Step_C
bclr Step_D
jmp motor10_100
motor20_40:
bclr Step_A
bset Step_B
bset Step_C
bclr Step_D
jmp motor10_100
motor20_50:
bclr Step_A
bset Step_B
bclr Step_C
bclr Step_D
jmp motor10_100
;;D
;;DC
;;C
;;CB
;;B
motor20_60:
bset Step_A
bset Step_B
bclr Step_C
bclr Step_D
jmp motor10_100
motor20_70:
bset Step_A
bclr Step_B
bclr Step_C
bclr Step_D
jmp motor10_100
motor20_80:
bset Step_A
bclr Step_B
bclr Step_C
bset Step_D
jmp motor10_100
motor90:
ret
//关机处理
Work_over:
bclr Step_A
bclr Step_B
bclr Step_C
bclr Step_D
b0bclr FopenPM
clr p2
ret
//APP事件处理
app:
bts1 FopenPM
jmp app90
bts0 Fdirection
jmp app20
;;BA
;;A
;;AD
;清开机标志
;;反转
app10:
bts1 Fp00
jmp app60
bts1 Fset
jmp $+3
bclr Fset
jmp app20
bts0 Fset1
jmp app20
bset Fset1
mov_ R_led1,Rwk00
app20:
bts1 F4step
jmp app90
bclr F4step
incms Rwk00
mov a, Rwk00
cmprs a, #6
jmp app90
clr Rwk00
app30:
bts0 Fdirection
jmp app50
bset Fdirection
bts0 Fset
jmp app40
mov_ R_led0, #7
app40:
mov_ Rwk01, R_led0
mov_ Rwk02, R_led1
jmp app90
app50:
bclr Fdirection
bts0 fp00
jmp $+3
;;正转
;;之前是否有无人标志
;;判断是否有人
;;保存有人时的位置
;;旋转完180°
;;反转
;;是否有无人标记
;;正转
;;是否有人在围
bts1 Fset1
jmp app80
bclr Fset
bclr Fset1
jmp app90
app60:
b0bts1 Fset1
jmp app20
b0bts0 Fset
jmp app20
b0bset Fset
mov_ R_led0,Rwk00
incms R_led0
jmp app20
app80:
call Work_over
clr Rwk02
mov_ Rwk01, #7
app90:
ret
//LED模拟风扇旋转
led_show:
bts1 FopenPM
jmp led_show90
b0mov a, ledcnt
jmp_a 7
jmp led_show00
jmp led_show10
jmp led_show20
jmp led_show30
jmp led_show40
jmp led_show50
jmp led_show60
led_show00:
mov a, #00h
;;是否有有人的标记
;;没有,关机
;;是否有无人标记
;;保存没人时的位置角度
;;关机
;;0°
jmp led_show70
led_show10:
mov a, #01h
jmp led_show70
led_show20:
mov a, #02h
jmp led_show70
led_show30:
mov a, #04h
jmp led_show70
led_show40:
mov a, #08h
jmp led_show70
led_show50:
mov a, #10h
jmp led_show70
led_show60:
mov a, #20h
led_show70:
mov p2,a
bts1 Fled
jmp led_show90
bclr Fled
incms ledcnt
mov a, ledcnt
cjae a, Rwk01, led_show80
jmp led_show90
led_show80:
mov_ ledcnt, Rwk02
jmp led_show90
led_show90:
ret
;;30°
;;60°
;;90°
;;120°
;;150°
;;180°
;;300ms时间
2024年5月16日发(作者:郎修齐)
智能电风扇控制器设计与开
发方案
1 绪论
1.1智能电风扇在当今社会中的研究意义
电风扇曾一度被认为是空调产品冲击下的淘汰品,其实并非如此,市场人士称,家
用电风扇并没有随着空调的普及而淡出市场,近两年反而出现了市场销售复的态势。其
主要原因:一是风扇和空调的降温效果不同——空调有强大的制冷功能,可以快速有效
地降低环境温度,但电风扇的风更温和,更加适合老人儿童和体质较弱的人使用;二是
电风扇有价格优势,价格低廉而且相对省电,体积轻巧,摆放方便,安装和使用都非常
简单。
尽管电风扇有其市场优势,但传统电风扇还是有许多地方应当进行改良的,最突出
的缺点是它不能根据温度的变化适时调节风力大小,对于夜间温差大的地区,人们在夏
夜使用电风扇时可能遇到这样的问题:当凌晨降温的时候电风扇依然在工作,可是人们
因为熟睡而无法察觉,既浪费电资源又容易引起感冒,传统的机械定时器虽然能够控制
电风扇在工作一定后关闭,但定时围有限,且无法对温度变化灵活处理。
有鉴于现今家里不可或缺的电器产品电风扇,我们希望可以借由步进电机组合做出
利用红外感应接收模块接收到有人的讯号,来改变电风扇转动的方向,以取代传统电风
扇只能以固定形式转动,希望能够让电风扇自动能感应到人所在的方向,未来让电器更
能人性化、科技化,以达到方便性智利于未来科技产业的发展,我们希望能将科技运用
在电器上,再于产业结合,已达到居家生活里的便利性。现今社会上,不可或缺的是将
生活周遭事物简单化,而我们将运用单芯片在电风扇上,研究出符合未来人们的需求,
研发低成本、多功能的全自动化电风扇让社会大众能够接受,取代传统式手动电风扇,
让科技产业在电器上有重大的突破。于以上方面的考虑,我们需要设计一种智能电风扇
控制系统来解决这些问题。
1.2 研究容及论文安排
1.2.1 研究容
本论文主要目标是使电风扇能够根据人的位置来自动选择送风角度。以SONIX公司
研发的SN8P2501B为主控器,利用红外感应接收装置,接受人体辐射出的红外线,通过
此讯号利用PM35L-048步进电机来改变红外感应接受装置,进而确定人体围,再通过发
光二极管指示锁定角度并模拟风扇循环闪烁。
由手动开关转变为红外线人体感应自动开关,是应用先进的红外线人体感应科技主
动侦测人体的问题是否在探测围,在设定15秒时间都可以探测到人,则开启电机开关,
开启LED角度循环闪烁;若在15秒开始存在有人信号,后存在无人信号,则重新计时
15秒检测;若一直存在无人信号则不操作动作。
1.2.2 论文安排
论文第1章为绪论,主要介绍了电风扇的现状,智能电风扇研究意义,本设计研究
的容及论文安排;第2章为系统设计方案的介绍,包括其具体可实现的功能及方案选择;
第3章为硬件设计部分,这部分详细介绍了所选硬件的特性及其各部分对实现自己所需
要功能的作用及其电路图;第4章为软件设计部分,给出了主程序和各子程序流程图,
程序清单以附件的形式附在论文最后。第5章为结论部分。接下来为致和参考文献。最
后附有原理图及程序清单。
2 系统设计方案
2.1 系统总体介绍
本次设计选用SONIX SN8P2501B为主控制芯片,与外围电路构成人体围检测系统。
MCU记录下侦讯到的人围,并送给LED发光二极管,使其模拟风扇循环闪烁。系统框图
如下图所示:
红外感应模块
微处理器
SN8P2501B
LED循环闪烁模块
步进电机模块
图2-1 系统框图
2.2 系统功能介绍
本系统利用LED发光二极管的循环闪烁来模拟风扇的来回旋转送风动作。主要功能
为:
a) 自动启动及关闭开关
我们由步进电机配合红外感应控制器经由红外线扫描来控制开关,检测到一定时间
有人时自动开启电机开关及LED闪烁;无人时关闭电机开关及LED闪烁。
b) 自动搜索围人数
我们以SN8P2501B来控制步进电机的步数,使它去侦测人数围有多大。
c) 锁定人体位置
我们利用红外感应控制器搜寻配合步进电机步数,有红外感应控制模块传回探测信
号给MCU,再由MCU来记忆人体位置,记录最大最小角度,锁定人体位置。
d) 发光二极管指示锁定角度并模拟风扇循环闪烁
用LED循环闪烁来模拟电风扇来回循环送风动作,每相邻两个LED之间间隔为30°。
例:当锁定人围为30°-90°时,LED从LED1至LED3循环闪烁(LED从左到右依次为
LED1、LED2、LED3、LED4、LED5、LED6,分别代表30°、60°、90°、120°、150°、
180°)。
2.3 设计方案
本设计根据红外感应装置的不同处理共有两种设计方案
a) 方案一
将红外感应模块前的菲泥尔滤光透镜用不透红外的材质覆盖上,让红外感应模块只
能检测到一个小围(小于10°)的红外变化,步进电机正转180°后即可反转180°,
如图2-2所示
图2-2 设计后的红外感应模块探测围
利用这种方法,可以不用考虑红外检测围是否存在人这种情况,原因是LED模拟的
角度是以30°来递增的,相比而言,红外检测的角度远远小于模拟的角度,即使在红
外检测围存在有人,在步进电机旋转一步后就可以检测出来,不会影响到检测的结果。
例:当步进电机正转90°后,红外探头检测到有人(探测角度87.5°…92.5°),
此时记录下的电机步数为X大步(X=3,90°);步进电机再次旋转7.5°,此时检测不
到人(探测围95°…100°),记录此时的电机步数为X+1大步(X=3,120°),对检测
没有什么影响。
图2-3 检测到有人存在
图2-4 下一状态检测不到人
这种方法的优点:思路比较简单,基本没有涉及到算法,在步进电机旋转速度比较
慢的情况下能够很快获得人的位置,从而改变LED的闪烁;缺点:需要利用不透红外材
料来封装,在开机情况下,需要人在此等待十几秒时间,确认一直有人存在开机后才能
离开此位置。
b) 方案二
事先确定红外感应装置的探测角度,步进电机需要正转360°。下面举例说明:
假设红外感应装置的探测角度为150°,人所在围为30°-120°围,则在步进电机
开始正转时就能够检测到有人存在(检测角度-75°…75°),步进电机旋转至90°(3
大步)时仍能检测到人(检测围30°…150°),只有当步进电机旋转至195°(6大步)
时才检测不到人(检测围120°…270°),此时记录的角度为210°(6+1大步),需要
减去红外感应装置探测角度的一半,此时才是真正开始没探测到人时人的位置,即结束
角度,角度为120°(6+1-(2+1)=4大步)(2+1为探测角度一半所占大步);步进电
机继续正转,当步进电机正转至315°(10大步)时,又一次检测到有人(检测围为
240°…30°),此时记录的角度为315°(10大步),仍然需要减去红外感应装置探测
角度的一半,则起始角度为30°(10+(2+1)-12=1大步)(2+1为探测角度一半所占
大步,12为旋转360°所需步数)。这样只记录两次值就得到了人的围,不论人站的稀
疏。
图2-5 红外探头初始位置
图2-6 检测到无人时的位置
图2-7 检测到刚有人时的位置
这种方法的优点:不需要做什么其他操作,开机更加人性化,不需要让电机进行反
转动作,在判断完人围后即可判断是否需要关机操作;缺点:思路有点复杂,中间涉及
到算法问题,事先必须知道此红外感应装置的探测角度,因为步进电机转速比较慢导致
确定一个围需要比较长的时间。
注:方案一和方案二中涉及到得确定围需要的时间是由所选红外感应装置决定的,
在这里所选的BISS0001默认延时时间为10秒,因此需要的时间比较长,如果调为1秒,
则步进电机旋转的速度扩大10倍,需要的时间也就相应缩短。
两种方案硬件电路完全一样,只是对红外感应装置的处理不同,主要表现在红外感
应装置的探测围上,实现不同的方案由程序控制。本设计选用方案一作为主要思路,原
因有几点:思路简单,容易被他人理解;可以允许在未检测区域随意改动位置,在当前
正转结束后用LED模拟显示出;在实物演示中,正转后反转不会对引线产生影响;在较
短时间可以看到演示效果
。
3 硬件设计
本系统主要由微处理器控制、红外感应模块、步进电机模块及LED模拟风扇旋转模
块等组成。下面介绍各部分原理及电路图。
3.1 微处理器
3.1.1 SN8P2500系列介绍
SN8P2500系列单片机是SONIX公司最新推出的高速低功耗8位单片机。它采用低
功耗CMOS设计工艺及高性能的RISC架构,具有优异的抗干扰性能。突出的特点是:低
成本、高抗干扰性、置16Mhz RC振荡电路、高速8位、59条精简指令集。
3.1.2 SN8P2501B单片机介绍
当前市场上的单片机有51系列,STC系列等单片机,考虑到设计只需实现自动开
关机及锁定人围LED闪烁的功能,但又要确保其抗干扰能力强的特点,在考虑功能需求
及成本的基础上,选择了SONIX公司研发的SN8P2501B 8位单片机作为本系统的控制器,
有14个引脚,如图3-1,它具有以下特性:
a) OTP ROM空间:1K * 16位;
b) RAM空间:48 字节;
c) STKP堆栈: 4层;
d) 多种振荡源选择:最大可达16MHz的外部晶振、10MHz的外部RC振荡、部16MHz
的高速时钟及16KHz的低速时钟;
e) 高速的CPU指令周期,可达1T,即每个指令周期为1个时钟周期;
f) 满足低功耗的需求,可编程设定4种工作模式:正常模式、低速模式、睡眠模
式和绿色模式;
g) 置高速PWM/Buzzer输出接口,可输出不同频率的信号;
h) 置RTC实时时钟(0.5s)、看门狗定时器(16KHz3V,32KHz5V)及3级低电压检
测系统;
i) 具有3个中断源,2个部中断源:T0、TC0,1个外部中断源:INT0。
1) I/O引脚配置
I/0口引脚为:
a) 输入输出双向端口:P0、P1、P2、P5;
b) 单向输入引脚:P1.1;
c) 可编程的漏极开路引脚:P1.0;
d) 具有唤醒功能的端口:P0、P1 电平变化触发;
e) 置上拉电阻端口:P0、P1、P2、P5;
f) 外部中断引脚:P0.0,由寄存器PEDGE 控制,其触发方式为上升沿或下降沿。
图3-1 SN8P2501B引脚
2) 程序寄存器
图3-2 程序存储器
SN8P2501B的程序寄存器为OTP ROM(一次性可编程),存储器容量为1K*16位,可
由10位程序计数器PC对程序寄存器进行寻址,或由系统寄存器(R,X,Y和Z)对ROM
的数据进行查表访问。其中:系统复位后从地址0000H开始执行;地址0008H是中断向
量入口地址。
3) 数据存储器
图3-3 数据存储器
SN8P2501B单片机的片RAM共有256个存储单元,地址围为000H-0FFH。片寄存器
可分为通用数据存储区和系统存储器两大部分。通用数据存储区可作为用户自定义的变
量,临时数据,中间数据存放地,而系统寄存器则用来控制片外设或表示外设的状态。
4) 定时/计数器
SONIX SN8P2708A MCU定时/计数器大分致为两大类。一类为基本定时器T0,另一
类为多功能定时器TC0。
二进制定时器T0 溢出(从0FFH 到00H)时,T0 继续计数并给出一个溢出信号触发
T0 中断请求。定时器T0 的主要用途如下:
a) 8 位可编程定时器:根据选定的时钟频率定时产生中断请求;
b) 定时器:根据选定的时钟信号产生中断请求,RTC 功能仅限于编译选项为
High_Clk = IHRC_RTC;
c) 绿色模式唤醒功能:T0ENB = 1 时,T0 溢出将系统从绿色模式中唤醒。
定时/计数器TC0 具有双时钟源,可根据实际需要选择部时钟或外部时钟作为计时
标准。其中,部时钟来自Fcpu,外部时钟INT0 由P0.0 引脚(下降沿触发)输入。寄存
器TC0M 控制时钟源的选择。当TC0 从0FFH 溢出到00H 时,TC0 在继续计数的同时产生
一个溢出信号,触发TC0 中断请求。
TC0 的主要作用如下:
a) 8 位可编程定时器:根据选定的时钟频率在特定时间产生中断信号;
b) 外部事件计数:对外部事件计数;
c) 蜂鸣器输出;
d) PWM输出。
下面以基本定时器T0为例,说明初始值的设定方法。
T0C:T0累加计数寄存器,上电初始值为00H,可以软件重置,每次溢出之后,初
始值需要用户重置。初始值设定方法如下:
T0C初始值 = 256 – (T0溢出间隔时间 × 输入时钟)
T0C初始值 = 256 – (T0溢出间隔时间 × 输入时钟)
= 256 – ( 10ms × 1M/64 )
= 64H
T0M中的Bit6:Bit4决定分频数的比率,T0的时钟源来自CPU,通过T0M中的
Bit6,Bit5,Bit4来控制分频数的比率,T0ENB位控制计数器时钟,如果为1则时钟输入
到T0计数器T0C中,T0开始计数,否则T0C的时钟被切断,T0C停止计数。当T0C计
数器从0FFH增加到000H时,系统会将标志位T0IRQ置为1。
表3-1 T0M寄存器
例如:用T0做一个10ms的定时,Fcpu=1M。T0rate选择010(Fcpu/64),那么
0D8H
T0M
复位后
Bit7
0
Bit6
0
Bit5
0
Bit4
0
Bit3
-
-
Bit2
-
-
Bit1
-
-
Bit0
T0TB
0
T0ENB T0rate2 T0rate1 T0rate0
T0TB:RTC 时钟控制位。
0 = 禁止RTC;
1 = RTC 模式。
T0RATE[2:0]:T0 分频选择位。
T0ENB:T0 启动控制位。
0 = 禁止T0;
1 = 开启T0。
表3-2 分频比
T0rate2~T0rate0
000
001
010
分频比
Fcpu/256
Fcpu/128
Fcpu/64
011
100
101
110
111
注:在RTC 模式下,T0RATE 的设置是无效的。
5) 中断
Fcpu/32
Fcpu/16
Fcpu/8
Fcpu/4
Fcpu/2
SONIX单片机是当今世界上很有影响力的精简指令集微控器,具有丰富的中断功能。
不过它们也存在一定的局限性,例如中断矢量只有一个,并且各个中断源之间也没有优
先级别之分,不具备中断屏蔽功能。
不同的芯片具有不同的中断。SN8P2501B单片机具有3个中断源:2个部中断源(定
时器T0、定时/计数器TC0)、1个外部中断源(INT0/P00)。
对于SONIX单片机来说,中断源的要否会得到响应,受允许中断寄存器INTIEN中
各位的控制。在全局中断控制位GIE为1时,才能使能中断请求,当中断源同时产生中
断时,要靠部的查询逻辑来确定响应的次序,不同的中断源其中断地址均为0008H。一
次中断活动的全过程如图3-4所示。
执行一条指令(1)
有中断请求 ?
(2)
Yes
中断屏蔽(3)
No
中断响应(4)
保护(5)
调查中断源(6)
中断处理(7)
清除标志(8)
恢复现场(9)
中断返回(10)
图3-4 中断处理流程图
No
Yes
在图中,(1),(2),(3)和(9)是由硬件自动实现的,而其它的阶段是由用户软件完
成的。有中断请求发生并被响应后,程序转至0008H 执行中断子程序。响应中断之前,
必须保存ACC、PFLAG 的容。芯片提供PUSH 和POP 指令进行入栈保存和出栈恢复,从而
避免中断结束后可能的程序运行错误。
PUSH/POP指令仅对ACC和PFLAG作中断保护,而不包括NT0和NPD。某些芯片PUSH/POP
只能保护PFLAG寄存器的值,ACC的值需要用户自己保存,此芯片中PUSH/POP可直接对ACC
和PFLAG进行保护。PUSH/POP 缓存器是唯一的且仅有一层,因此只能出现在中断保护现
场中。
6) SN8P2501B单片机编译选项表
利用SN8P2501B芯片作为微控制器,在编译过程中需要注意对应的选项表,见表
3-3。
表3-3 SN8P2501B单片机编译选项表
编译选项
Noise_Filter
配置项目
Enable
Disable
Fhosc/1
Fhosc/2
功能说明
开启杂讯滤波功能,Fcpu = Fosc/4~Fosc/16
关闭杂讯滤波功能,Fcpu = Fosc/1~Fosc/16
指令周期 = 1个时钟周期,必须关闭杂讯滤波功能;
IHRC_16M 和IHRC_RTC 模式下,不支持Fosc/1
指令周期 = 2 个时钟周期,必须关闭杂讯滤波功能;
IHRC_16M 和IHRC_RTC 模式下,不支持Fosc/2
指令周期 = 4 个时钟周期
指令周期 = 8 个时钟周期
指令周期 = 16 个时钟周期
高速时钟采用部16MHz RC 振荡电路,XIN/XOUT
(P1.3/P1.2)作为普通的I/O 引脚;
IHRC_16M 模式下,Fcpu 取值在Fosc/4~Fosc/16 之间
高速时钟采用部16MHz RC 振荡电路,具有RTC 功能
(0.5sec),XIN/XOUT(P1.3/P1.2)作
为普通的I/O 引脚;
IHRC_RTC 模式下,Fcpu 取值在Fosc/4~Fosc/16 之间
外部高速时钟振荡器采用廉价的RC 振荡电路,XOUT(P1.2)
为普通的I/O 引脚
外部高速时钟振荡器采用低频、省电晶体/瓷振荡器(如
32.768KHz)
外部高速时钟振荡器采用高频晶体/瓷振荡器(如
10MHz~12MHz)
外部高速时钟振荡器采用标准晶体/瓷振荡器(如
1M~10MHz)
始终开启看门狗定时器,即使在睡眠模式和绿色模式下也
处于开启状态
开启看门狗定时器,但在睡眠模式和绿色模式下关闭
关闭看门狗定时器
使能外部复位引脚
P1.1 为单向输入引脚,无上拉电阻
VDD 低于2.0V 时,LVD 复位系统;
Fcpu
Fhosc/4
Fhosc/8
Fhosc/16
IHRC_16M
IHRC_RTC
High_Clk
RC
32K X’tal
12M X’tal
4M X’tal
Always_On
Watch_Dog
Enable
Disable
Reset_Pin
LVD
Reset
P11
LVD_L
LVD_M
LVD_H
Enable
Disable
注:
VDD 低于2.0V 时,LVD 复位系统;
PFLAG 寄存器的LVD24 位作为2.4V 低电压监测器
VDD 低于2.4V 时,LVD 复位系统;
PFLAG 寄存器的LVD36 位作为3.6V 低电压监测器
ROM 代码加密
ROM 代码不加密
Security
a) 在干扰严重的情况下,建议开启杂讯滤波功能,此时Fcpu = Fosc/4 ~ Fosc/16,
并将Watch_Dog 设置为“Always_On”;
b) 如果用户设置看门狗为“Always_On”,编译器将自动开启看门狗定时器;
c) 编译选项Fcpu 仅针对高速时钟,在低速模式下Fcpu = FILRC/4;
d) 在IHRC_16M 和IHRC_RTC 模式下,Fcpu = Fosc/4 ~ Fosc/16。
3.1.3 单片机复位电路
SN8P2501B 有以下几种复位方式:
a) 上电复位;
b) 看门狗复位;
c) 掉电复位;
d) 外部复位(仅在外部复位引脚处于使能状态)。
上述任一种复位发生时,所有的系统寄存器恢复默认状态,程序停止运行,同时程
序计数器PC 清零。复位结束后,系统从向量0000H 处重新开始运行。PFLAG 寄存器的
NT0 和NPD 两个标志位能够给出系统复位状态的信息。用户可以编程控制NT0 和NPD,
从而控制系统的运行路径。
表3-4 PFLAG寄存器
086H
PFLAG
读/写
复位后
Bit7
NT0
R/W
X
Bit6
NPD
R/W
X
Bit5
LVD36
R
0
Bit4
LVD24
R
0
Bit3
-
-
-
Bit2
C
R/W
0
Bit1
DC
R/W
0
Bit0
Z
R/W
0
NT0、NPD:复位状态标志
表3-5 复位状态标志复位情况
NT0
0
0
1
NPD
0
1
0
复位情况
看门狗复位
保留
上电及LVD复位
说明
看门狗溢出
-
电源电压低于LVD检测值
1 1 外部复位 外部复位引脚检测到低电平
任何一种复位情况都需要一定的响应时间,系统提供完善的复位流程以保证复位动
作的顺利进行。对于不同类型的振荡器,完成复位所需要的时间也不同。因此,VDD 的
上升速度和不同晶振的起振时间都不固定。RC 振荡器的起振时间最短,晶体振荡器的
起振时间则较长。在使用的过程中,应注意考虑主机对上电复位时间的要求。图3-5为
各种复位方式的响应。
图3-5 各种复位电路的响应
在这里所用的复位为外部复位。外部复位功能由编译选项“Reset_Pin”控制。将
该编译选项置为“Reset”,可使能外部复位功能。外部复位引脚为施密特触发结构,
低电平有效。复位引脚处于高电平时,系统正常运行。当复位引脚输入低电平信号时,
系统复位。外部复位操作在上电和正常工作模式时有效。需要注意的是,在系统上电完
成后,外部复位引脚必须输入高电平,否则系统将一直保持在复位状态。外部复位的时
序如下:
a) 外部复位(当且仅当外部复位引脚为使能状态):系统检测复位引脚的状态,如
果复位引脚不为高电平,则系统会一直保持在复位状态,直到外部复位结束;
b) 系统初始化:初始化所有的系统寄存器;
c) 振荡器开始工作:振荡器开始提供系统时钟;
d) 执行程序:上电结束,程序开始运行。
外部复位可以在上电过程中使系统复位。良好的外部复位电路可以保护系统以免进
入未知的工作状态。
外部复位电路有多种复位方式,如RC复位电路、二极管及RC复位电路等。
1) RC复位电路
如图3-6
图3-6 RC复位电路
图3-7为一个由电阻R1 和电容C1 组成的基本RC 复位电路,它在系统上电的过程中
能够为复位引脚提供一个缓慢上升的复位信号。这个复位信号的上升速度低于VDD 的上
电速度,为系统提供合理的复位时序,当复位引脚检测到高电平时,系统复位结束,进
入正常工作状态。
2) 二极管及RC复位电路
如图3-7
图3-7 二极管及RC复位电路
R1和C1同样是为复位引脚提供输入信号。对于电源异常情况,二极管正向导通使C1
快速放电并与VDD保持一致,避免复位引脚持续高电平、系统无常复位。
注:“基本RC 复位电路”和“二极管及RC 复位电路”中的电阻R2 都是必不可少
的限流电阻,以避免复位引脚ESD(Electrostatic Discharge)或EOS(Electrical
Over-stress)击穿 。
本设计电路比较简单,对复位响应时间没有太大的要求,考虑成本及电路规划的基
础上采用RC复位电路作为此MCU的复位电路。
3.1.4 单片机晶振电路
对于本芯片来说,主要有两种晶振来源:外部石英/瓷振荡器和部高速RC振荡器。
1) 外部石英/瓷振荡器
其电路图如图3-8
图3-8 外部石英/瓷振荡器
图3-9中,XIN/XOUT/VSS 引脚与石英/瓷振荡器以及电容C之间的距离越近越好。
2) 部高速RC振荡器
编译选项“IHRC_16M”和“IHRC_RTC”控制单片机的置RC高速时钟(16MHz)。若选
择“IHRC_16M”,则置16MHz RC振荡器作为系统时钟源,XIN和XOUT引脚作为通用I/O 口。
若选择“IHRC_RTC”,则系统时钟来自置16MHz RC振荡器,同时XIN 和XOUT 引脚与实
时时钟源(RTC)32768HZ石英晶体相连。
IHRC:系统高速时钟来自置16MHz RC振荡器,XIN/XOUT 引脚作为普通的I/O引脚。
IHRC_RTC:置16MHZ RC振荡器作为系统高速时钟,同时XIN 和XOUT 引脚与实时时
钟源(RTC)32768Hz石英晶体相连。RTC的周期为0.5 s,RTC 的定时器为T0。
本设计需要11个I/O口(6个LED控制位,4个步进电机控制位,1个输入信号位),
所选用的MCU资源刚刚满足需要,过程中不需要获取非常准确的时间,因此选用MCU置的
16MHz RC高速振荡器作为系统时钟源,XIN 和XOUT引脚作为通用I/O口。
3.1.5 微处理器控制电路
图3-9 控制电路
MCU所需电压在2.4V-5.5V围,在此选取典型电压5.0V;步进电机正常工作电压在12V
或24V,但考虑到步进电机在此处只带动红外感应模块,不需要比较大的动力,为了简
化电路,采用7.5V电压。这样只需要将通过电源适配器获得的7.5V电压转化成5.0V即可,
这里需要用到电压转换芯片7805。电路图如图3-10所示,其中C1/C2/C3/C4增强电源抗
干扰能力。
图3-10 电源电路
控制电路图如图3-9所示。图中,C5为0.1uF的电容,分别与MCU VDD 和VSS 相连,
可以增强MCU 抗干扰能力。Q5为PNP型8550三极管,它在这里只是起升压作用,升0.6V
左右电压,使之大于0.7VDD,满足MCU I/O口电平需求。U2为红外感应装置。红外感应
模块随着步进电机的旋转而旋转,将探测到得信号通过2口输送出来。当红外感应模块
检测到人时,2口输出高电平,通过Q5使MCU的P0.0口变为高电平;当红外感应模块未检
测到人时,2口输出低电平,MCU的P0.0口变为低电平,这样MCU就可以只检测P0.0的状
态就可以判断是否有人。
Q1-Q4为NPN型8050三极管,它在这里起开关功能。D7-D10为二极管1N4148,因为MCU
对应步进电机各口输出的电平一会儿是高电平,一会儿是低电平,相当于PWM信号,通
过步进电机线圈后会产生感应磁场,进而产生反电动势,产生回路电流,通过续流二极
管(D7-D10)而衰减掉,从而保护了Q1-Q4三极管。线圈两端分别为A、B、C、D,哪位
被驱动,步进电机旋转对应的角度,具体情况由程序控制。
当在设定时间(防止因干扰而造成开机),红外感应模块输出的电平一直是高电平,
此时就认为有人存在,打开LED模拟风扇旋转循环闪烁功能,步进电机开始工作。步进
电机带着红外感应装置开始正转,当红外感应模块在之前没有检测到有人及无人标志时
检测到有人存在,则记录此时步进电机步数X1(即角度);当红外感应模块在之前检测
到有人标志,但没有检测到无人标志时,检测到无人存在,记录此时步进电机步数X2(即
角度),在步进电机正转180°后,LED开始以X1-X2的方式循环闪烁,步进电机开始反
转180°,只有当步进电机再一次正转180°后,LED才会按照后来检测到的X1-X2循环闪
烁。当步进电机在正转180°中,红外感应模块始终没有检测到有人信号,则在步进电
机反转180°后关闭LED模拟风扇旋转循环闪烁功能,并关闭步进电机。
3.2 步进电机
3.2.1 步进电机工作原理
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况
下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影
响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步
进电机只有周期性的单步误差和累积误差等特点。使得在速度、位置等控制领域用步进
电机来控制变的非常的简单。虽然步进电机已被广泛地应用,但步进电机并不能象普通
的直流电机、交流电机在常规下使用。步进电机必须由双环形脉冲信号、功率驱动电路
等组成控制系统方可使用。
1) 反应式步进电机原理
下面以三相反应式步进电机来介绍反应式步进电机的原理。
a) 结构:
电机转子均匀分布着很多小齿,定子齿有三个励磁绕阻,其几何轴线依次分别与转
子齿轴线错开。 0T、1/3T、2/3T,(相邻两转子齿轴线间的距离为齿距以T表示),即
A与齿1相对齐,B与齿2向右错开1/3T,C与齿3向右错开2/3T,A'与齿5相对齐,
(A'就是A,齿5就是齿1)图3-11为定转子的展开图:
图3-11 定转子的展开图
b) 旋转:
若A相通电,B,C相不通电时,由于磁场作用,齿1与A对齐,(转子不受任何
力以下均同)。
若B相通电,A,C相不通电时,齿2应与B对齐,此时转子向右移过1/3T,此时
齿3与C偏移为1/3T,齿4与A偏移(T-1/3T)=2/3T。
若C相通电,A,B相不通电,齿3应与C对齐,此时转子又向右移过1/3T,此时
齿4与A偏移为1/3T对齐。
若A相通电,B,C相不通电,齿4与A对齐,转子又向右移过1/3T 这样经过A、
B、C、A分别通电状态,齿4(即齿1前一齿)移到A相,电机转子向右转过一个齿距,
如果不断地按A,B,C,A……通电,电机就每步(每脉冲)1/3T,向右旋转。如按C,B,
A,C……通电,电机就反转。
由此可见:电机的位置和速度由导电次数(脉冲数)和频率成一一对应关系。而方
向由导电顺序决定。 不过,出于对力矩、平稳、噪音及减少角度等方面考虑。往往采
用A-AB-B-BC-C-CA-A这种导电状态,这样将原来每步1/3T改变为1/6T。甚至于通过
二相电流不同的组合,使其1/3T变为1/12T,1/24T,这就是电机细分驱动的基本理论
依据。
不难推出:电机定子上有m相励磁绕阻,其轴线分别与转子齿轴线偏移
1/m,2/m……(m-1)/m,1。并且导电按一定的相序电机就能正反转被控制——这是步进电
机旋转的物理条件。
c) 力矩:
电机一旦通电,在定转子间将产生磁场(磁通量Ф),如图3-12:
图3-12 定转子通电产生磁场
当转子与定子错开一定角度产生力,F与(dФ/dθ)成正比
磁通量
Ф=Br * S(Br为磁密,S为导磁面积)
(3-1)
F与L*D*Br成正比(L为铁芯有效长度,D为转子直径,Br=N·I/R);
N·I为励磁绕阻安匝数(电流乘匝数),R为磁阻;
力矩=力*半径;
可以得到力矩与电机有效体积*安匝数*磁密成正比(只考虑线性状态),因此,电
机有效体积越大,励磁安匝数越大,定转子间气隙越小,电机力矩越大,反之亦然
2) 永磁感应子式步进电机原理
下面以四相感应子式步进电机为例来介绍永磁感应子式步进电机原理。
四相电机工作原理:电机定子有四个励磁绕阻,转子均匀分布着很多小齿,并加有
永磁体使转子轴向分布若干对N-S齿极,且N、S齿极互相错开1/2T(T为相邻两转子齿
轴线间的距离,即齿距)。定转子齿几何轴线依次向左错开:0、1/4T、2/4T、3/4T。以
下为四相电机定、转子展开后的工作原理图(见图3-13)。
图3-13 四相电机工作原理图
以四相单四拍即A—B—C—D—A通电方式,转子不受外力为例。 第一拍:当A相
通正向电流(如图3-13示电流方向),B、C、D相不通电时,有工作原理图可看出,定
子A极产生S极磁场,由于磁场作用,转子N1齿将与定子A极轴线与相对齐,而N2齿
与B极,N3齿与C极,N4齿与D极,N5齿与A极的轴线以次向右错开1/4T, 2/4T, 3/4T,1T。
第二拍:当B相通正向电流,A、C、D相不通电时,N2齿将于B极轴线相对齐,此
时转子向右转过1/4T,而N3齿与C极,N4齿与D极,N5齿与A极轴线以次向右错开
1/4T, 2/4T, 3/4T。
同理,第三拍C相通正向电流,转子又向右转过1/4T。第四拍D相通正向电流,D
与N4相对齐,转子再次向右转过1/4T,N5齿与A极轴线向右错开1/4T。
当再到A相通正向电流时,N5齿与A极轴线相对齐,至此转子转过一个齿距T,如
果不断地按A-B-C-D-A…通电,电机就按每步(每脉冲)1/4T向右连续旋转。如按
A-D-C-B-A……通电,电机则反转。
如果通的不是正向电流而是反向电流,定子产生的不是S极而是N极,每相通电时
对应的S齿与其轴线相对齐,旋转的方向不变。
感应子式步进电机某种程度上可以看作是低速同步电机。一个四相电机可以作四相
运行,也可以作二相运行。(必须采用双极电压驱动),而反应式电机则不能如此。例如:
四相,八相运行(A-AB-B-BC-C-CD-D-DA-A)完全可以采用二相八拍运行方式.不难发现
其条件为C=A ,D=B . 一个二相电机的部绕组与四相电机完全一致,小功率电机一般直
接接为二相,而功率大一点的电机,为了方便使用,灵活改变电机的动态特点,往往将
其外部接线为八根引线(四相),这样使用时,既可以作四相电机使用,更可以作二相
电机绕组串联或并联使用,灵活的改变电机的性能。
感应子式步进电机与传统的反应式步进电机相比,结构上转子加有永磁体,以提供
软磁材料的工作点,而定子激磁只需提供变化的磁场而不必提供磁材料工作点的耗能,
因此该电机效率高,电流小,发热低。因永磁体的存在,该电机具有较强的反电势,其
自身阻尼作用比较好,使其在运转过程中比较平稳、噪音低、低频振动小。
感应子式步进电机以相数可分为:二相电机、三相电机、四相电机、五相电机等。
以机座号(电机外径)可分为:42BYG(BYG为感应子式步进电机代号)、57BYG、86BYG、
110BYG(国际标准),而像70BYG、90BYG、130BYG等均为国标准。
3.2.2 步进电机的静态指标术语
相数:产生不同对极N、S磁场的激磁线圈对数。常用m表示。
拍数:完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一
个齿距角所需脉冲数,以四相电机为例,有四相四拍运行方式即AB-BC-CD-DA-AB,四
相八拍运行方式即 A-AB-B-BC-C-CD-D-DA-A。
步距角:对应一个脉冲信号,电机转子转过的角位移用θ表示。θ=360度(转子
齿数J*运行拍数),以常规二、四相,转子齿为50齿电机为例。四拍运行时步距角为
θ=360度/(50*4)=1.8度(俗称整步),八拍运行时步距角为θ=360度/(50*8)=0.9
度(俗称半步)。
定位转矩:电机在不通电状态下,电机转子自身的锁定力矩(由磁场齿形的谐波以
及机械误差造成的)。
静转矩:电机在额定静态电作用下,电机不作旋转运动时,电机转轴的锁定力矩。
此力矩是衡量电机体积(几何尺寸)的标准,与驱动电压及驱动电源等无关。
3.2.3 步进电机的动态指标术语
单步误差:步进电机每转过一个步距角的实际值与理论值的误差称之为单步误差。
用百分比表示:误差值/步距角*100%。不同的细分驱动器和不同的细分数其值不同。
累积误差:步进电机转过的实际角度值与理论值的最大误差称之为累积误差,其值
为单步误差值的总和的最大值。以具体角度值表示。它比单步误差更为重要。
失步:电机运转时运转的步数,不等于理论上的步数,称之为失步。
失调角:转子齿轴线偏移定子齿轴线的角度,电机运转必存在失调角,由失调角产
生的误差,采用细分驱动是不能解决的。
最大空载起动频率:电机在某种驱动形式、电压及额定电流下,在不加负载的情况
下,能够直接起动的最大频率。
最大空载的运行频率:电机在某种驱动形式,电压及额定电流下,电机不带负载的
最高转速频率。
3.2.4 PM35L-048步进电机介绍
红外感应模块需要在步进马达的带动下去检测人围,因此对步进马达的要求比较
高,尽量选择永磁感应式步进电机,步进电机每步旋转角度不能太大,也不能太小。角
度太大会造成锁定人围的误差较大;角度太小会导致判断围所需时间太长。综合考虑后
本设计选用PM35L-048永磁感应四相式步进电机,采用四相八拍法来带动红外感应模
块。PM35L-048永磁感应四相式步进电机,步矩角为7.5°,相数为4, 因此电机一步
旋转角度为7.5°。
其参考特性入表3-5所示
表3-5 PM35L-048参考特性
参考特性
电机尺寸
每旋转步数
驱动方式
驱动电路
驱动电压
电流/相
线圈电阻/期
驱动IC
永磁材料
绝缘电阻
电介质强度
绝缘等级
工作温度
储存温度
经营坎
24V
30欧姆
25C3346
PM35L-048
48(7.5°/1步)
2-2相
Unipolar Bipolar Chopper
24V
500mA
5.5欧姆
UDN29168-V
铁氧体磁铁塑胶(MSPL)
极地各项异性铁氧体烧结磁体(MS50)
铷铁硼磁铁粘结(MS70)
最小电阻100M欧姆
最小交流电压500V
E类
-10°C--50°C
-30°C--80°C
相对湿度20%--90%
其电路图为
图3-14 步进电机电路
D7-D10起保护三极管功能,因为输出的信号是PWM信号,经过步进电机后,电机
部的磁场会产生反电动势,使NPN的集电极电压增大,通过D7-D10除去反电动势,保
护三极管。
3.3 红外感应模块
3.3.1 红外感应装置的工作原理
人体都有恒定的体温,一般在37°,会发射10um左右的特定波长红外线,用专门的
热释电红外传感器(PIR)就可以针对性的检测这种红外线的存在与否,当人体红外线照
射到传感器上后,因热释电效应将向外释放电荷,后续电路经检测处理后就能产生控制
信号。这种专门设计的探头只对波长为10μm左右的红外辐射敏感,所以除人体以外的
其他物体不会引发探头动作。探头包含两个互相串联或并联的热释电元,而且制成的两
个电极化方向正好相反,环境背景辐射对两个热释元件几乎具有相同的作用,使其产生
释电效应相互抵消,于是探测器无信号输出。一旦人侵入探测区域,人体红外辐射通过
部分镜面聚焦,并被热释电元接收,但是两片热释电元接收到的热量不同,热释电也不
同,不能抵消,于是输出检测信号。
为了增强敏感性并降低白光干扰,通常在探头的辐射照面覆盖有特殊的菲泥尔滤光
透镜,菲泥尔透镜有两种形式,即折射式和反射式。菲泥尔透镜作用有两个:一是聚用,
即将热释的红外信号折射(反射)在PIR上,第二个作用是将警戒区分为若干个明区和
暗区,使进入警戒区的移动物体能以温度变化的形式在PIR上产生变化热释红外信号,
这样PIR就能产生变化的电信号。
3.3.2 BISS0001红外感应信号处理器
BISS0001是一款高性能的传感信号处理集成电路。静态电流极小,配以热释电红
外传感器和少量外围元器件即可构成被动式的热释电红外传感器。
特点:
CMOS数模混合专用集成电路;
具有独立的高输入阻抗运算放大器;
部的双向鉴幅器可有效抑制干扰;
设延迟时间定时器和封锁时间定时器,调节围;
工作电压围为+3V~+5V ;
图3-15 BISS0001管脚图
表3-6 引脚说明
引脚 名称
1 A
I/O
I
功能说明
可重复触发和不可重复触发选择端。当A为“1”时,允许重复触
发;反之,不可重复触发
控制信号输出端。由VS的上跳前沿触发,使Vo输出从低电平跳
变到高电平时视为有效触发。在输出延迟时间Tx之外和无VS的
上跳变时,Vo保持低电平状态。
输出延迟时间Tx的调节端
输出延迟时间Tx的调节端
触发封锁时间Ti的调节端
2
3
4
5
V0
RR1
RC1
RC2
O
--
--
--
6
7
8
9
10
11
12
13
14
15
16
RR2
VSS
VRF
VC
IB
VDD
2OUT
2IN-
1IN+
1IN-
1OUT
--
--
I
I
--
--
O
I
I
I
O
触发封锁时间Ti的调节端
工作电源负端
参考电压及复位输入端。通常接VDD,当接“0”时可使定时器复
位
触发禁止端。当VC>VR时允许触发(VR≈0.2VDD)
运算放大器偏置电流设置端
工作电源正端
第二级运算放大器的输出端
第二级运算放大器的反相输入端
第一级运算放大器的同相输入端
第一级运算放大器的反相输入端
第一级运算放大器的输出端
图3-16 BISS0001部框图
BISS0001是由运算放大器、电压比较器、状态控制器、延迟时间定时器以及封锁
时间定时器等构成的数模混合专用集成电路。
表3-7 BISS0001直流特性参数
符号
V
D0
I
D0
参数
电压工作围
工作电流
测试条件
--
V
D0
=3V
无负载
V
D0
=5V
最小值
3V
--
--
最大值
5V
50uA
100uA
V
OS
I
OS
Avo
CMRR
V
YH
V
YL
V
RH
V
RL
V
CH
V
CL
V
AH
V
AL
输入失调电压
输入失调电流
开环电压增益
共模抑制比
运放输出高电平
运放输出低电平
Vc端输入高电平
Vc端输入低电平
Vo端输出高电平
Vo端输出低电平
A端输入高电平
A端输入低电平
V
D0
=5V
V
D0
=5V
V
D0
=5V,R
L
=1.5M
V
D0
=5V,R
L
=1.5M
V
D0
=5V
R
L
=500K接1/2 V
D0
V
RF
= V
D0
=5V
V
D0
=5V,I
CH
=0.5mA
V
D0
=5V,I
CH
=0.1mA
V
D0
=5V
V
D0
=5V
--
--
60dB
60dB
4.25V
--
1.1V
--
4V
--
3.5V
--
50mV
50nA
--
--
--
0.75V
--
0.9V
--
0.4V
--
1.5V
以下图所示的不可重复触发工作方式下的波形,来说明其工作过程。
图3-17 不可重复触发工作方式
首先,根据实际需要,利用运算放大器OP1组成传感信号预处理电路,将信号放大。
然后耦合给运算放大器OP2,再进行第二级放大,同时将直流电位抬高为VM(≈0.5VDD)
后,将输出信号V2送到由比较器COP1和COP2组成的双向鉴幅器,检出有效触发信号
Vs。由于V
H
≈0.7VDD、
VL
≈0.3VDD,所以,当VDD=5V时,可有效抑制±1V的噪声干扰,
提高系统的可靠性。COP3是一个条件比较器。当输入电压V
C
>V
R
时,COP3输出为高电平,
进入延时周期。当A端接“0”电平时,在Tx时间任何V2的变化都被忽略,直至Tx时
间结束,即所谓不可重复触发工作方式。当Tx时间结束时,Vo下跳回低电平,同时启
动封锁时间定时器而进入封锁周期Ti。在Ti时间,任何V2的变化都不能使Vo跳变为
有效状态(高电平),可有效抑制负载切换过程中产生的各种干扰。
以下图所示的可重复触发工作方式下的波形,来说明其工作过程。
图3-18 可重复触发工作方式
可重复触发工作方式下的波形在V
C
=“0”、A=“0”期间,信号Vs不能触发Vo为
有效状态。在V
C
=“1”、A=“1”时,Vs可重复触发Vo为有效状态,并可促使Vo在Tx
周期一直保持有效状态。在Tx时间,只要Vs发生上跳变,则Vo将从Vs上跳变时刻起
继续延长一个Tx周期;若Vs保持为“1”状态,则Vo一直保持有效状态;若Vs保持
为“0”状态,则在Tx周期结束后Vo恢复为无效状态,并且,同样在封锁时间Ti时间,
任何Vs的变化都不能触发Vo为有效状态。
图3-19 BISS0001应用电路图
上图中,运算放大器OP1将热释电红外传感器的输出信号作第一级放大,然后由
C3耦合给运算放大器OP2进行第二级放大,再经由电压比较器COP1和COP2构成的双
向鉴幅器处理后,检出有效触发信号Vs去启动延迟时间定时器,输出信号Vo经晶体管
T1放大驱动继电器去接通负载。
R3为光敏电阻,用来检测环境照度。当作为照明控制时,若环境较明亮,R3的电
阻值会降低,使9脚的输入保持为低电平,从而封锁触发信号Vs。SW1是工作方式选择
开关,当SW1与1端连通时,芯片处于可重复触发工作方式;当SW1与2端连通时,芯
片则处于不可重复触发工作方式。输出延迟时间Tx由外部的R9和C7的大小调整,值
为Tx≈24576*R9*C7;触发封锁时间Ti由外部的R10和C6的大小调整,值为
Ti≈24*R10*C6。
3.3.4 红外感应装置输出电平转换
利用红外感应装置获得的输入电平为0V或3.3V,而MCU I/O可识别的高电压
为>0.7VDD,即3.5V,显然不能直接将3.3V获得的电压直接送给MCU,需要利用转化电
路将其转换为MCU可正确读取的电平信号。下面是几种自己在设计中考虑过的电平转换
电路。
图3-20 PNP转换电平
利用这种方法是将从红外感应装置中获取的信号升0.6V左右电压,这样,通过PNP
型三极管后获得的电压为0.6V或3.9V,满足MCU I/O口可识别的电平电压。
缺点:这种方法只适合用于通过提升小电压(0.6V左右)即可满足条件的电路。
图3-21 NPN转换电平
在这种方法中,NPN型三极管起开关作用。当输出口2为低电平(0V)时,三极管
不导通,MCU I/O口获得5V的高电平;当输出口2为高电平时,三极管导通,MCU I/O
口获得0V的低电平。
缺点:在本设计中,红外模块在检测到有人时输出高电平(3.3V)信号,经过NPN
开关三极管后,MCU获得低电平信号,即2口为高电平,I/O对应口为低电平时说明检
测到人,容易电平搞混淆。
在考虑到现有资源及成本的情况下,选取PNP电平转换方法。
4 软件设计
程序设计的总体思想是模块化设计,即将程序划分为三层结构:应用层、介面层和
底层驱动程序。如图4-1所示。
底层驱动层主要包含直接和硬件相关的驱动程序,如LED闪烁、按键,蜂鸣器,继
电器和电机控制等。底层的各模块间要保持各自的独立性,不产生直接的数据交互,底
层也不直接访问应用层,如果需要,都要通过介面层进行数据交互。
介面层主要提供数据交互,为应用层和底层驱动之间以及底层驱动层各模块之间提
供数据的交互。
应用层主要是完成具体功能的实现,它要通过介面层控制底层驱动层各模块来完成
所需功能,而不能越过介面层直接访问底层驱动层。所有的用户接口要在应用层来实现。
应用层
应用层
介面层
数据交互
底层驱动层
红外感应
发光二极管闪烁 电机控制 ......
图4-1 软件结构图
4.1 主程序设计
主程序实现的功能是:完成步进电机的控制,实现自动扫描人数围、发光二极管模
拟风扇旋转循环闪烁等。它通过介面层控制底层驱动层各模块来实现所需功能,而不能
越过界面层直接访问底层驱动层。所有的用户接口都要在应用层来实现。
a) 堆栈指针
SN8P2501B的堆栈缓存器共有四层,程序进入中段或执行CALL指令时,用来存储
程序寄存器PC的值,寄存器STKP为堆栈指针,指向堆栈缓存器顶层。系统复位时,堆
栈指针寄存器容为默认值,建议用软件再将默认值7FH送进STKP以确保开始时堆栈指
针处于栈顶。
b) RAM初始化
一个完整的用户自定义寄存器初始化动作或清零动作是非常重要的,否则容易造成
程序执行的不确定性,甚至会导致程序出现跑飞现象。当程序上电复位时,RAM区各寄
存器存放的数值是随机存储的。为确保程序的正确运行,需要对用户定义的寄存器进行
初始化清零动作。
c) 系统寄存器初始化
系统寄存器也必须进行初始化。系统初始化包括对外部振荡器、I/O口方向和输出
电平,定时计数器的初始化等。本设计中各模块均需要通过I/O口和MCU打交道,故需
要对其进行初始化。值得强调的是在设计中没有用到的I/O口最好设置成输入上拉模
式,以防电平干扰。同时,也要将定时器在初始化程序中设置,以让它按设置好的时间
产生中断并处理。
对于本设计程序而言,采用的计时方式是只判断中断请求标志位,而不让其进入中
断服务程序中处理,这样可以减少程序指令,节省ROM空间。
d) 预处理
在程序中有些寄存器需要初值,这些就要在预处理中处理。正确的初值会使程序跑
的准确,相反,忘记赋初值或赋了不正确的初值,就有可能使程序执行不准确甚至不能
实现相应的功能。
e) 看门狗复位
看门狗定时器WDT用于监控程序的正常执行,如果由于干扰,程序进入未知状态,
看门狗定时器溢出,系统进行复位,因此在主程序每一次开始时,需要对看门狗寄存器
复位,以防止程序运行中出现死循环。SONIX 有专门针对看门狗复位的宏:RST_WTD。
f) 调用子程序
本设计主要的功能在子程序中实现,所以,主程序中需要循环调用各子模块。子模
块分别为:分时时间处理模块,步进电机旋转模块,APP模块,LED模拟闪烁模块
主程序流程图如下:
开始
初始化
(系统初始化和预
处理)
清看门狗
分时时间处理
步进电机转动处理
APP事件处理
发光二极管循环点
亮事件处理
结束
图4.2 主程序流程图
4.2 分时时间处理
分时时间处理就是对程序中用到的时间进行统一处理,有两个时间基准:一个是由
TC0产生的50ms时基;一个是由50ms生成的1秒作为时基。具体需要操作的时间有:开机
启动时间15秒、步进电机每步间隔时间5秒、LED循环闪烁时间300ms。其流程图为:
开始
有TC0中断请求
(50ms)?
yes
500msLED闪烁
时间到了?
yes
2.5s(步进电机
1拍间隔时间)
到了?
yes
no
no
no
1s时间到了?
yes
no
15s开机时间到
了?
yes
结束
no
图4-3 分时时间处理流程图
4.3 步进电机转动处理
步进电机转动处理主要就是实现步进电机按照某一频率旋转。在这里,步进电机需
要按照频率为5秒(红外感应模块延时时间为10秒)的速度来实现正反旋转(正:
A-AB-B-BC-C-CD-D-DA;反:D-DC-C-CB-B-BA-A-AD)。
流程图为:
开始
是否为开机状
态?
yes
每拍间隔时间
是否到了?
yes
no
no
是正转吗?
yes
按A-AB-B-BC-C-
CD-D-DA转动
no
按D-DC-C-CB-B-
BA-A-AD转动
结束
图4-4 步进电机旋转处理流程图
4.4 APP事件处理
APP事件处理主要是用来处理要实现的功能,也就是前面所说的应用层,所有的数
据都在这里进行处理。在这里主要是根据红外感应模块的检测情况处理动作,其流程图
为:
开始
是否检测
no
yes
no
是否是正转
yes
是否有人
no
yes
旋转到180°?
yes
no
yes
是否曾经有无
人信号
no
是否曾经有游
人信号
no
yes
反转
no
正转?
yes
是否曾经有有
人信号
no
是否曾经有无
人信号
no
yes
yes
是否曾有有人
信号
no
yes
记录此时步进电机
步数=Rwk02
记录此时步进电机
步数+1=Rwk01
关机
步进电机步数处理
返回
图4-5 APP处理流程图
4.5 LED循环闪烁
LED循环闪烁是用来模拟电风扇旋转的。在开始的正转180°,LED依次循环点亮;
正转结束后,LED按照记录的人的位置来循环点亮,循环间隔300ms。其流程图为:
开始
LED是否点亮
no
yes
点亮Rwk02对应
LED
500ms是否到
yes
no
Rwk02+1
Rwk02=Rwk01?
yes
no
Rwk02<=R_led1
结束
图4-6 LED闪烁流程图
5 结论
本设计的目标就是利用LED模拟实现电风扇旋转位置智能化,自然而然就要用到红
外探测器来侦测目标,在网上搜索有关信息,发现有能够只检测人的红外感应模块装置,
符合设计需要,并使设计过程简单化,排除了其他红外的干扰。在这里步进电机带动红
外感应模块做搜寻的动作,这样就把探测角度问题转化成步进电机旋转所走步数问题。
因为模拟角度有限,每个LED灯代表30°,因此人的围也以30°来递增。
起初采用方案一操作时,没有考虑遮掩其探测角度,导致在用LED模拟时只能模拟
出自动开关机动作,而人所在位置判断的结果误差很大,思考分析原因后,就想到了方
案二,利用方案二模拟功能,可以无需考虑其他因素,比较准确的模拟出当前人所在位
置,不过需要旋转360°,对于目前使用的探头模拟的,时间相对比较长,且会对绕线
产生影响,要解决这些问题,需要定做延时时间比较短的红外感应模块,正转360°后
需要反转360°,对于这种演示实物来说成本太大。因此就把目光又转移到方案一上,
不过这次添加了防红外的材料,降低探头的探测角度,将误差缩小化,分析发现,当探
头的探测角度小于步进电机两步所走角度(即15°)时,即可准确探测(前提是锁定人
围是以30°来递增的)。
本设计有几个地方实现比较困难,例如红外感应模块是可以调节延时时间的长短
的,但是如果时间过短,会使输出的信号失真,就只能当作开关使用;另外步进电机的
旋转速率其实也是由红外感应模块的延时时间决定的,在延时时间为10秒左右时,理论
上步进电机的旋转速度为每步2.5秒左右即可实现准确检测,事实上并不是这样,因为
红外感应信号处理器设有锁定时间,在大量测试后得出步进电机为每步5秒左右时才能
够正确判断人所在位置。
经过多次测试验证,LED可按照实际的人位置来循环点亮,各种预定功能均可以实
现,显然实现了此次设计的目的。如果时间充足的话,还可以在此设计基础上加入模拟
自动调风、定时及照明等功能,从而实现电风扇的智能化。
致
浑然不觉大学已过了三年,我们也走到了要跟大学说再见的时候,回望三年大学生
涯,酸甜苦辣各种滋味充实着生活,使自己在人生的道路上学会面对,学会坚强。借此,
向关心支持我的家人,老师,朋友们致以真诚的意,感你们这些年对我的关心和帮助,
感你们在我沮丧时给我鼓舞,你们在我无助的时候默默的支持我;同样感那些曾帮助过
我的陌生人,你们。
毕业设计的撰写,并不仅仅是我们交给老师,交给学校的最后一份作业,也是我们
检验自己大学三年所学知识及对自己以后人生发展具有很重要意义的一份报告。在毕业
设计全过程中,得到了系上老师的。如果不是你们,这个实物是不会顺利完成的,当发
现电路图可能出现问题,是你们和我一起搭板子测试功能的正确性,排除问题及提出新
的方案。在这里,我真诚的感你们。
感我在学校的毕业设计指导老师书凯老师,论文上的每一部分,都和你的帮助及支
持分不开的,虽然你不能直接给我指导,但是通过网络和手机随时了解我的进展情况及
遇到的问题,在开题报告和毕业设计编写期间,你无私的为我审阅,并提出宝贵的意见。
感我的舍友及大学的每一位同学,感你们在人生最重要的三年中陪我一起愉快地走
过,是你们在我失败时鼓励我,在我骄傲时提醒我,在我彷徨时安慰我,在我前进时支
持我。我把最诚挚的意送给你们,同时也希望你们再接再厉,为了明天,加油!
祝大家前途似锦,一帆风顺。
参 考 文 献
[1] 玉杰.松翰SN8P2700系列单片机原理及应用技术[M].:航空航天大学,2007.
[2] 松翰 SN8P2501B Datasheet[R].:松翰科技,2006.
[3] 钱云,汤勇明,涵春.电子器件[D].2006年02期.
[4] 程德福,林君.智能仪器[M].:机械工业,2005.
[5] BISS0001 Datasheet[R].:商思达电子,2007.
[6] 严长城.一种智能电风扇[P].中国专利:201377448,2010-1-6.
[7] 詹勳鸿.智慧型电风扇[D].:北科学技术学院,2008.
[8] 林敏.计算机控制技术及工程应用[M].:国防工业,2005.
[9] 何立民.单片机高级教程应用与设计[M].:航空航天大学,1997.
[10]
[11]
[12]
[13]
丁建军,定方,周国柱.基于AT89C51的智能电风扇控制系统[N].工学院学报,
昔华,王延川.电风扇智能控制模块的设计[N].渝州大学学报(自然科学版),
沙占友.集成化智能传感器原理及应用[M].:电子工业,2004.
康华光.电子技术基础数字部分(第四版) [M].高等教育,2002.
2003-2.
2000-2.
附录Ⅰ 系统原理图
图Ⅰ-1 系统原理图
附录Ⅱ 程序代码
软件程序代码:
CHIP
SN8P2501B
LVD_H ; 2.4V Reset Enable LVD36 bit of PFLAG for
//{{SONIX_CODE_OPTION
.Code_Option LVD
3.6V Low Voltage Indicator
.Code_Option Reset_Pin P11
.Code_Option Watch_Dog Always_On
.Code_Option High_Clk IHRC_16M ; Internal 16M RC Oscillator
.Code_Option Fcpu #7 ; Fcpu = Fosc/16
.Code_Option Security Enable
.Code_Option Noise_Filter Enable
//}}SONIX_CODE_OPTION
.NOLIST
INCLUDESTD MACRO1.H
INCLUDESTD MACRO2.H
INCLUDESTD MACRO3.H
;;SONIX 宏
.LIST
.DATA
INCLUDE
INCLUDE
ORG 00H
jmp reset
ORG 09H
mov
call
call
bset
a, #7fh
;;clear stack
FengShan_2501b_
FengShan_2501b_
.CONST
.CODE
reset:
mov stkp, a
sys_init
sys_premain
Fgie
//主程序
main:
rst_wdt
Call sys_intgnd
Call motor
Call app
Call led_show
jmp main
ENDP
//用户自定义RAM
sys_ram:
flag0 DS 1
Fled EQU flag0.0
Fstep EQU flag0.1
FopenPM EQU flag0.2
Fdirection EQU flag0.3
Ffirst EQU flag0.4
Fset1 EQU flag0.5
F4step EQU flag0.6
Fset EQU flag0.7
R_300ms DS 1
R_1s DS 1
R_2500ms DS 1
R_15s DS 1
stepcnt DS 1
ledcnt DS 1
R_led0 DS 1
R_led1 DS 1
Rwk00 DS 1
Rwk01 DS 1
Rwk02 DS 1
//用户自定义常量
sys_equ:
L_50ms EQU 3CH
L_300ms EQU 6
L_2500ms EQU 50
;;100msled显示标志位
;;步进电机一拍所用时间标志位
;;电机工作标志位
;;电机工作方向标志位
;;开机开始计时标志位
;;开始有人标志位
;;走完4步结束标志位
;;开始没人标志位
;;4步计数
;;led显示计数
;;暂时存放无人时的位置
;;暂时存放有人时的位置
;;电机走?个4步
;;存放没人时的位置
;;存放有人时的位置
时基
;;300ms时间,50ms为时基
;;2.5s时间,50ms为时基
;;50ms
L_1s EQU 20
L_15s EQU 15
Step_D EQU p1.3
Step_C EQU p1.2
Step_B EQU p5.4
Step_A EQU p1.0
//系统初始化
sys_init:
sys_init_oscm:
clr oscm
sys_init_ram:
b0mov y, #00h
b0mov z, #2fh
sys_init_ram10:
clr yz
decms z
jmp sys_init_ram10
clr yz
sys_init_tc0:
b0bclr ftc0irq
b0bclr ftc0ien
mov_ tc0c, #L_50ms
mov tc0r, a
mov a,#10000100b
mov tc0m, a
sys_init_io:
b0bclr p0m.0
mov a, #00001101b
b0mov p1m, a
b0mov p1ur,a
clr p0
clr p1
clr p2
clr p5
mov a, #0ffh
;;1s时间,50ms为时基
;;15s时间,1s为时基
;;work in normal mode
;;Fcpu/256,使能tc0,自动装载
b0mov p2m, a
b0mov p5m, a
b0mov p5ur, a
ret
sys_init90:
//程序预处理
sys_premain:
mov_
mov_
ret
R_1s, #L_1s
Rwk01, #7
//分时时间处理
sys_intgnd:
bts1
jmp
bclr
call
call
jmp
mov_
call
ret
mov a, R_300ms
cmprs a, #00h
decms R_300ms
jmp
mov_
bset
ret
mov a, R_2500ms
cmprs a, #00h
timechat0_90
R_300ms, #L_300ms
Fled
Ftc0irq
Ftc0irq
timechat0
timechat1
sys_intgnd90
decms R_1s
sys_intgnd90
R_1s, #L_1s
timechat2
sys_intgnd90:
timechat0:
timechat0_90:
timechat1:
decms R_2500ms
jmp timechat1_90
mov_ R_2500ms, #L_2500ms
bset Fstep
timechat1_90:
ret
timechat2:
bts0 FopenPM
jmp timechat2_90
bts1 FP00
jmp timechat2_10
bts0 Ffirst
jmp $+3
mov_ R_15s, #L_15s
bset Ffirst
mov a, R_15s
decms R_15s
jmp timechat2_90
bset FopenPM
mov_ R_2500ms, #L_2500ms
mov_ R_300ms, #L_300ms
timechat2_10:
bclr Ffirst
timechat2_90:
ret
//步进电机工作处理
motor:
bts1 FopenPM
jmp motor90
bts1 Fstep
jmp motor90
bclr Fstep
b0mov a, stepcnt
bts0 Fdirection
jmp motor20
;;是否第一次
循环闪烁
;;反转
;;led
motor10:
jmp_a 8
jmp motor10_10
jmp motor10_20
jmp motor10_30
jmp motor10_40
jmp motor10_50
jmp motor10_60
jmp motor10_70
jmp motor10_80
motor10_10:
bset Step_A
bclr Step_B
bclr Step_C
bclr Step_D
jmp motor10_100
motor10_20:
bset Step_A
bset Step_B
bclr Step_C
bclr Step_D
jmp motor10_100
motor10_30:
bclr Step_A
bset Step_B
bclr Step_C
bclr Step_D
jmp motor10_100
motor10_40:
bclr Step_A
bset Step_B
bset Step_C
bclr Step_D
jmp motor10_100
motor10_50:
;;A
;;AB
;;B
;;BC
bclr Step_A
bclr Step_B
bset Step_C
bclr Step_D
jmp motor10_100
motor10_60:
bclr Step_A
bclr Step_B
bset Step_C
bset Step_D
jmp motor10_100
motor10_70:
bclr Step_A
bclr Step_B
bclr Step_C
bset Step_D
jmp motor10_100
motor10_80:
bset Step_A
bclr Step_B
bclr Step_C
bset Step_D
motor10_100:
incms stepcnt
mov a, stepcnt
cmprs a, #08h
jmp motor90
clr stepcnt
bset F4step
jmp motor90
motor20:
jmp_a 8
jmp motor20_10
jmp motor20_20
jmp motor20_30
;;C
;;CD
;;D
;;DA
jmp motor20_40
jmp motor20_50
jmp motor20_60
jmp motor20_70
jmp motor20_80
motor20_10:
bclr Step_A
bclr Step_B
bclr Step_C
bset Step_D
jmp motor10_100
motor20_20:
bclr Step_A
bclr Step_B
bset Step_C
bset Step_D
jmp motor10_100
motor20_30:
bclr Step_A
bclr Step_B
bset Step_C
bclr Step_D
jmp motor10_100
motor20_40:
bclr Step_A
bset Step_B
bset Step_C
bclr Step_D
jmp motor10_100
motor20_50:
bclr Step_A
bset Step_B
bclr Step_C
bclr Step_D
jmp motor10_100
;;D
;;DC
;;C
;;CB
;;B
motor20_60:
bset Step_A
bset Step_B
bclr Step_C
bclr Step_D
jmp motor10_100
motor20_70:
bset Step_A
bclr Step_B
bclr Step_C
bclr Step_D
jmp motor10_100
motor20_80:
bset Step_A
bclr Step_B
bclr Step_C
bset Step_D
jmp motor10_100
motor90:
ret
//关机处理
Work_over:
bclr Step_A
bclr Step_B
bclr Step_C
bclr Step_D
b0bclr FopenPM
clr p2
ret
//APP事件处理
app:
bts1 FopenPM
jmp app90
bts0 Fdirection
jmp app20
;;BA
;;A
;;AD
;清开机标志
;;反转
app10:
bts1 Fp00
jmp app60
bts1 Fset
jmp $+3
bclr Fset
jmp app20
bts0 Fset1
jmp app20
bset Fset1
mov_ R_led1,Rwk00
app20:
bts1 F4step
jmp app90
bclr F4step
incms Rwk00
mov a, Rwk00
cmprs a, #6
jmp app90
clr Rwk00
app30:
bts0 Fdirection
jmp app50
bset Fdirection
bts0 Fset
jmp app40
mov_ R_led0, #7
app40:
mov_ Rwk01, R_led0
mov_ Rwk02, R_led1
jmp app90
app50:
bclr Fdirection
bts0 fp00
jmp $+3
;;正转
;;之前是否有无人标志
;;判断是否有人
;;保存有人时的位置
;;旋转完180°
;;反转
;;是否有无人标记
;;正转
;;是否有人在围
bts1 Fset1
jmp app80
bclr Fset
bclr Fset1
jmp app90
app60:
b0bts1 Fset1
jmp app20
b0bts0 Fset
jmp app20
b0bset Fset
mov_ R_led0,Rwk00
incms R_led0
jmp app20
app80:
call Work_over
clr Rwk02
mov_ Rwk01, #7
app90:
ret
//LED模拟风扇旋转
led_show:
bts1 FopenPM
jmp led_show90
b0mov a, ledcnt
jmp_a 7
jmp led_show00
jmp led_show10
jmp led_show20
jmp led_show30
jmp led_show40
jmp led_show50
jmp led_show60
led_show00:
mov a, #00h
;;是否有有人的标记
;;没有,关机
;;是否有无人标记
;;保存没人时的位置角度
;;关机
;;0°
jmp led_show70
led_show10:
mov a, #01h
jmp led_show70
led_show20:
mov a, #02h
jmp led_show70
led_show30:
mov a, #04h
jmp led_show70
led_show40:
mov a, #08h
jmp led_show70
led_show50:
mov a, #10h
jmp led_show70
led_show60:
mov a, #20h
led_show70:
mov p2,a
bts1 Fled
jmp led_show90
bclr Fled
incms ledcnt
mov a, ledcnt
cjae a, Rwk01, led_show80
jmp led_show90
led_show80:
mov_ ledcnt, Rwk02
jmp led_show90
led_show90:
ret
;;30°
;;60°
;;90°
;;120°
;;150°
;;180°
;;300ms时间