| 本文档为赛元提供的雾化器库的使用说明,雾化器库支持1.7M、2.4M和3M频率的雾化片,库提供了函数接口进行设置。其中1.7M雾化片适用于大功率加湿器(功率在15W以上),2.4M、3M雾化片适用于小功率的香薰机(功率在6-12W)。雾化器库提供了自动追频、功率设置、雾化工作、触控检水功能。库共提供了11个函数接口供用户调用,实现雾化器功能。一、雾化器库介绍:
 雾化器Atomizer文件夹中包含:
 SC91F832_C.H MCU头文件
 Atomizer.h 包含雾化器外部调用接口函数
 SOC_Atomizer_lib_V1.3.LIB 雾化器库文件
 实现雾化器工作需要占用一定的系统资源,雾化器库资源占用:
 ROM:1.8K DATA: 50BYTE XDATA:60BYTE
 定时器:定时器0
 PWM: PWM1
 ADC:两路ADC
 EEPROM: 4byte
 Touch Key: 两路
 超声波加湿器的工作设计流程图  三、雾化器库函数接口和接口说明``
 雾化器库共提供10个函数接口和3个全局变量:
 变量:bit TrackFreqFlag; 变量说明:追频完成标志0:未完成;1:完成
 变量:bit AjustPowerFlag; 变量说明:功率调整完成标志0:未完成;1:完成
 变量:bit Water_flag; 变量说明:水位检测输出结果 0:缺水;1:有水
 函数:bit SOCAPI_GetTrackFreqStaus(void);函数功能:获取雾化器追频状态,返回1为已追频,0为未追频
 函数:void SOCAPI_SetFreq(void) ;函数功能:设置雾化器工作频率,当得到已追踪过频率可以调用该函数设置雾化器的频率
 函数:void SOCAPI_Atomizer_Init(INT8U mode);函数说明:雾化器初始化,设置PWM和定时器0;设置mode为0时雾化器的工作频率设置为1.7M;mode为1时为2.4M;mode为2时为3M
 函数:void SOCAPI_TrackFreq_Init(void);函数功能:雾化器追频初始化,设置了追频所需的变量,需要在追频前调用
 函数:void SOCAPI_TrackFreq(void);函数功能:雾化器追频,该函数需要在SOCAPI_TrackFreq_Init之后在主程序中一直调用,直到TrackFreqFlag变量置1,追频完成后进入功率调整
 函数:void SOCAPI_AtomizerSetPower(INT8U Power);函数功能:设置雾化器工作时最大档功率,1.7M:设置范围 15-21W;2.4M、3M:设置范围6-12W
 函数:void SOCAPI_AdjustPower(void);函数功能:进行功率调整,将最大档功率调制到设定功率,需要在SOCAPI_AtomizerSetPower之后调用
 函数:void SOCAPI_AtomizerSetGear(INT8U Gear);函数功能:设置档位,16档可调,0为低档,16为高档位,用户可以在当中选择任意档位作为目标功率
 函数:void SOCAPI_AtomizerWork(void);函数说明:雾化器雾化工作,该函数需要在主函数中无阻塞调用
 函数: void SOCAPI_WaterLevelDetectorInit(INT16U Initial_Diff,int ThresholdTmp,INT8U Speed); 函数说明:水位检测初始化,设置水位检测参数 函数:void SOCAPI_WaterLevelDetector(void);函数功能:水位检测,检测结果由Water_flag输出
 四、雾化器库的具体使用雾化器库使用准备: 雾化器的检水功能需要使用到Touch Key,赛元提供触控库帮助用户使用赛元的触控功能,具体使用见触控库的使用说明或者联系赛元的工程师,在项目工程中添加触控库;采集TK通道的数据,设置main.h中以下三个参数:
 #define CH_INITIAL_DIFF 668
 参数说明:检测通道与参考通道的初始比例,采样通道无水时RAWdata/参考通道RAWdata1000
 #define WATERThresholdtmp 1300
 参数说明:检测通道有无水差值0.6,如完全覆的差值为2166,则设置为1300。
 #define WATERCHECK_SPEED 20
 参数说明:水位检测的确认次数 ,取值范围10-249 ,确认时间为10*Nms
 通过函数SOCAPI_WaterLevelDetectorInit()进行设置;
 本软件库适用于赛元的SC91F831和SC91F832芯片,用户使用时需将Atomizer文件夹添加到项目工程中,并在KEIL项目中添加Atomizer文件夹中的SOC_Atomizer_lib_V1.3.LIB,1、在工程主文件中调用雾化器库文件
 #include “Atomizer\Atomizer.h” //包含雾化器外部调用接口函数
 2、清除EEPROM空间在主文件中加入INT8U code EE_Data[4]={0,0,0,0}; //清除EEPROM的空间
 设置工程配置的BL51 Locate选项卡中的CODE为?CO?MAIN(0X1f00)
 3、初始化雾化器工作根据使用的雾化片频率调用函数SOCAPI_Atomizer_Init(0); 对雾化器进行初始化
 4、水位检测初始化调用以下函数对雾化器进行初始化,该函数需要在水位检测函数调用前进行设置
 SOCAPI_WaterLevelDetectorInit(CH_INITIAL_DIFF,WATERThresholdtmp,WATERCHECK_SPEED);
 5、查询是否追频调用函数SOCAPI_GetTrackFreqStaus,返回是否已追踪过频率,若已追频则调用函数SOCAPI_SetFreq设置雾化器工作的频率,若未追踪过频率则进行追频
 6、追踪频率调用函数SOCAPI_AtomizerSetPower设置雾化器工作的最大档功率,建议加湿器设置为16-21W,香薰机设置为6-12W;设置雾化器的功率后调用SOCAPI_TrackFreq_Init()对追频进初始化;在主函数中无阻塞的调用函数SOCAPI_TrackFreq_Init直到TrackFreqFlag变量置1,追频完成后进入功率调整
 7、功率调整追频完成后将ADC切换到检测电流的ADC口,无阻塞调用函数 SOCAPI_AdjustPower进行功率调整,将最大档的功能调整到设定值;由于器件差异,调整后功率误差在正负1W左右;
 8、雾化器雾化在主函数中无阻塞的调用函数SOCAPI_AtomizerWork()进行雾化工作,切勿在追频和调整功率过程调用该函数
 9、档位调整在雾化器正常雾化过程可以调用函数SOCAPI_AtomizerSetGear进行设置档位,函数支持16吉档位设置,雾化器库将最大档均分成16级档位,用户可以根据所需的各档位功率选择合适的档位作为实际工作的档位。
 10、检测水位雾化器库已经在雾化时调用了水位检测函数,检测结果由Water_flag输出,若用户需要在雾化器不正常雾化下检水则需要在主函数中调用程序段:
 if(SOCAPI_TouchKeyStatus&0x80) // Bit7:一轮按键扫描是否完成?
 {
 SOCAPI_TouchKeyStatus&=0x7f; // 清掉 Bit7:一轮扫描完成标志
 TouchKeyScan(); // 数据算法处理后,读取键值
 SOCAPI_WaterLevelDetector(); // 水位检测
 TouchKeyRestart(); // 启动下一轮扫
 }
 若在使用中有任何的疑问请联系赛元的工程师!
 B:操作步骤:1、 输入电压: 交流220V\直流24V
 2、 最大档功率: 约20W
 3、 指示灯状态: 缺水: 红灯亮;
 正常工作:绿灯亮
 模式选择:红绿灯交替闪烁
 追频: 绿灯闪烁
 关机: 红绿灯灭
 4、 功率档位: 0~16档可调,每档功率约为20W/16*档位,通过旋钮开关调节,逆时针拧为减小功率,顺时针拧为增加功率。
 5、 关机:逆时针拧到尽头
 6、 追频模式:关机进入开机状态时,红绿灯交替闪5秒钟,此为等待是否选择追频模式。5秒钟内由最小功率档位拧到最大功率档位,再拧到最小功率档位并停留在最小功率档位,此时会进入追频模式,追频过程中绿灯闪烁约5秒种,闪烁完成后绿灯亮进入正常工作模式。
 7、 触控检水:检水弹片,检水弹片塞在水槽中间的圆柱内,当水量过低时,会检测到缺水状态并亮红灯,需要加水后重新开机再进入正常工作模式。
 C:注意事项:1、 更换雾化片后,需要重新追频;
 2、 重新烧录程序后,需要重新追频;
 3、 触控检水的接口接线由于是跳线,拆装时容易松动,注意必须要接上并良好接触,不能随意更换线;
 二、 香薰机样机:A:图示如下:
 B:操作步骤:1、 输入电压: 交流220V\直流24V
 2、 最大档功率: 约10W
 3、 指示灯状态: 缺水: 4个绿灯全亮;
 开机: 最左的绿灯亮
 减档: 第2个绿灯亮
 加档: 第3个绿灯亮
 关机: 全灭
 追频: 4个绿灯全闪;
 4、 功率档位: 0~4档可调,每档功率约为10W/4*档位,开机状态下按下第2个按键为减档,按下第3个按键为加档。
 5、 开、关机:按下最左边第1个按键
 6、 追频模式:同时按下第2个和第3个按键,进入追频模式
 7、 触控检水:检水弹片,当水量过低时,会检测到缺水状态并4个绿灯全亮,加水后检测有水状态下会进入开机模式,此时为0档位
 C:注意事项:1、 更换雾化片后,需要重新追频;
 2、 重新烧录程序后,需要重新追频;
 超声波加湿器 设计参考源代码/************************************************************
 // Copyright © 苏州 GLORY
 // 文件名称 : Atomizer.c
 // 作者 :
 // 模块功能 : 香薰机
 // 局部函数列表:
 //*************************************************************#include “h\SC91F832_C.h”
 #include “lib\SensorMethod.h” //包含touchkey外部调用接口函数
 #include “h\data_type.h”
 #include “Atomizer\Atomizer.h” //包含雾化器外部调用接口函数
 //#define sif_debug#ifdef sif_debug
 #include “sif\sif_bus.h”
 #endif
 #define BS(SFR,NUM) (SFR|=(1<<NUM)) //清bit位#define BC(SFR,NUM) (SFR&=~(1<<NUM)) //bit位置1
 #define SET(SFR,NUM) (SFR = NUM)
 //宏定义****//#define WAITMODE 0 //等待模式
 #define TRACKFREQ 1 //自动追频
 #define STRATMODE 2 //工作模式
 #define STOPMODE 3 //停机模式
 #define MAXGEAR 4 //调整功率模式
 #define ON 1#define OFF 0
 #define KEYCOUNT 5
 #define FAN P36 //风扇
 #define LED_COM P27
 #define LED1 P35#define LED2 P34
 #define LED3 P32
 #define LED4 P31
 #define LED1SP (BS(P3CFG1,2),BC(P3CFG1,3))
 #define LED2SP (BS(P3CFG1,0),BC(P3CFG1,1))
 #define LED3SP (BS(P3CFG0,4),BC(P3CFG0,5))
 #define LED4SP (BS(P3CFG0,2),BC(P3CFG0,3))
 #define SET_LED_OUT LED1SP;LED2SP;LED3SP;LED4SP
 #define KEY1 P35#define KEY2 P32
 #define KEY3 P34
 #define KEY1MI (BC(P3CFG1,2),BC(P3CFG1,3),SET(P35,1))
 #define KEY2MI (BC(P3CFG0,4),BC(P3CFG0,5),SET(P32,1))
 #define KEY3MI (BC(P3CFG1,0),BC(P3CFG1,1),SET(P34,1))
 #define SET_KEY_IN KEY1MI;KEY2MI;KEY3MI
 INT8U code EE_Data[4]={0,0,0,0}; //清除EEPROM的空间 INT8U WorkMode,Power_Gear=0; //水位检测********// #define CH_INITIAL_DIFF 888#define WATERThresholdtmp 800 //1300
 #define WATERCHECK_SPEED 10 //水位检测的速度,确认次数 ,取值范围30-249 ,若10MS扫描一轮则确认时间为500ms
 //全局变量********//INT8U timer1msCount=0;
 INT8U timer10msCnt=0;
 INT8U timer100msCnt=0;
 INT8U Key1Cnt=0;
 INT8U Key2Cnt=0;
 INT8U Key3Cnt=0;
 INT8U KeyBuf=0;
 bit LED1Flag=0;
 bit LED2Flag=0;
 bit LED3Flag=0;
 bit LED4Flag=0;
 bit btime100ms=0;bit btimer10ms=0; //10ms标志
 bit timer1msFlag=0;
 bit Timer1sFlag=0;
 bit KeyStaus=0;bit openflag=0;
 /**************************************************
 函数名称:void StartWork(void)
 函数功能:启动模式
 入口参数:void
 出口参数:void
 /
 void StartWork(void)
 {
 WDTCR |=0x10; // 清狗
 if((Water_flag == 0))
 {
 WorkMode = STOPMODE; //无水进入停机模式
 }
 }
 /
 函数名称:void StopWork(void)
 函数功能:停机模式
 入口参数:void
 出口参数:void
 **************************************************/
 void StopWork(void)
 {
 P13=OFF;
 ENPWM=0;
 LED1Flag=ON;
 LED2Flag=ON;
 LED3Flag=ON;
 LED4Flag=ON;
 FAN=OFF;
 Power_Gear=0;
 SOCAPI_AtomizerSetGear(Power_Gear4);
 if((Water_flag == 1))
 {
 WorkMode = STRATMODE; //无水进入停机模式
 LED2Flag=OFF;
 LED3Flag=OFF;
 LED4Flag=OFF;
 FAN=ON;
 }
 }
 /*******************************************
 *函数名称:void KeyScan(void)
 *函数功能:按键扫描
 *入口参数:void
 *出口参数:void
 **************************************************/
 void KeyScan(void)
 {
 LED_COM=OFF;
 SET_KEY_IN;
 if(KEY1==0)
 {
 if(Key1Cnt<250)Key1Cnt++;
 if(Key1Cnt>KEYCOUNT)
 {
 KeyBuf|=0x01;
 }
 }
 else
 {
 Key1Cnt=0;
 KeyBuf&=(~0x01);
 }
 if(KEY2==0){
 if(Key2Cnt<250)Key2Cnt++;
 if(Key2Cnt>KEYCOUNT)
 {
 KeyBuf|=0X02;
 }
 }
 else
 {
 Key2Cnt=0;
 KeyBuf&=(~0x02);
 }
 if(KEY30){
 if(Key3Cnt<250)Key3Cnt++;
 if(Key3Cnt>KEYCOUNT)
 {
 KeyBuf|=0X04;
 }
 }
 else
 {
 Key3Cnt=0;
 KeyBuf&=(~0x04);
 }
 }
 /**************************************************
 *函数名称:void ChangeKeyValue(void)
 *函数功能:按键处理
 *入口参数:void
 *出口参数:void
 **************************************************/
 void ChangeKeyValue(void)
 {
 switch(KeyBuf)
 {
 case 0x01:
 if(KeyStaus0)
 {
 KeyStaus=1;
 if(openflag0)
 {
 if(SOCAPI_GetTrackFreqStaus()1) //追频成功标志
 {
 openflag=1;
 WorkMode = STRATMODE;
 Power_Gear=1;
 SOCAPI_AtomizerSetGear(Power_Gear*4);
 FAN=1;
 }
 }
 else
 {
 openflag=0;
 LED2Flag =0;
 LED3Flag =0;
 LED4Flag =0;
 WorkMode = WAITMODE;
 FAN=0;
 }
 LED1Flag=openflag;
 }
 break;
 case 0x02:
 if(KeyStaus0)
 {
 KeyStaus=1;
 if((openflag1)&&(Water_flag == 1)) //开机响应
 {
 LED2Flag=1;
 LED3Flag=0;
 if(Power_Gear==0)Power_Gear=1;
 Power_Gear–;
 SOCAPI_AtomizerSetGear(Power_Gear*4); //设置档位
 }
 }
 break;
 case 0x04:if(KeyStaus0)
 {
 KeyStaus=1;
 if((openflag1)&&(Water_flag == 1)) //开机响应
 {
 LED2Flag=0;
 LED3Flag=1;
 if(Power_Gear>=4)Power_Gear=3;
 Power_Gear++;
 SOCAPI_AtomizerSetGear(Power_Gear*4); //设置档位
 }
 }
 break;
 case 0x06:
 SOCAPI_AtomizerSetPower(7);
 SOCAPI_TrackFreq_Init();
 WorkMode = TRACKFREQ;
 break;
 default:
 KeyStaus=0;
 break;
 }
 }
 /**************************************************
 *函数名称:void LedScan(void)
 *函数功能:LED扫描
 *入口参数:void
 *出口参数:void
 /
 void LedScan(void)
 {
 SET_LED_OUT;
 LED1= ~LED1Flag;
 LED2= ~LED2Flag;
 LED3= ~LED3Flag;
 LED4= ~LED4Flag;
 LED_COM=ON;
 }
 /
 *函数名称:void Timer1()interrupt 3
 *函数功能:定时器中断服务函数
 *入口参数:void
 出口参数:void
 **************************************************/
 void timer1()interrupt 3
 {
 TH1 = (65536-4000)/256; //4001/4us=1Ms
 TL1 = (65536-4000)%256;
 timer1msFlag=1;
 timer1msCount++;
 if(timer1msCount>=10)
 {
 timer1msCount=0;
 btimer10ms=1;
 timer10msCnt++;
 if(timer10msCnt>=10)
 {
 timer10msCnt=0;
 btime100ms=1;
 timer100msCnt++;
 if(timer100msCnt>25)
 {
 timer100msCnt=0;
 Timer1sFlag=1;
 }
 }
 }
 }
 /***************************************************函数名称:void Sys_Init(void)
 *函数功能:系统初始化
 *入口参数:void
 *出口参数:void
 **************************************************/
 void Sys_Init(void)
 {
 RSTCFG = 0x24; //P1.0切换为IO ,LVR复位选择2.45V
 WDTCR =0x90; //启动看门狗,262MS复位
 //ADC设置ADCCFG = 0x84; //选择ADD为参考电压VDD,选择P12,P17作ADC输入口.
 ADCCR = 0x87; //打开ADC电源,ADC CLK=Fosc,选通P17通道
 //定时器1初始化 ,定时器0给雾化器使用TMCON = TMCON|0x02; //选择时钟分频,Fosc/4=4Mhz;1/4us
 TMOD = TMOD|0x10; //设置工作方式1
 TH1 = (65536-4000)/256; //400*1/4us=1Ms
 TL1 = (65536-4000)%256;
 TR1=0; //定时器T1的运行控制位。打开timer1前,先清TRO
 ET1=1; //允许timer1中断
 TR1=1; //允许timer1开始计数
 //**************************************************SOCAPI_Atomizer_Init(1); //初始化雾化器,函数内设置了PWM,定时器0
 SOCAPI_WaterLevelDetectorInit(CH_INITIAL_DIFF,WATERThresholdtmp,WATERCHECK_SPEED);
 //**************************************************
 EA=1; //打开总中断TouchKeyInit(); //触摸按键初始化
 #ifdef sif_debugIPSIF=1;
 Debug_TouchKeyIICInit(0); //0:TK参数为程序设置 1:TK参数为Touch Key Tool软件设置
 #endif
 P3CFG1=(P3CFG1&0Xcf)|0X10; //P36 ,强推挽,风扇P2CFG1=(P2CFG1&0X3F)|0X40; //p27 ,强推挽,com
 }/**************************************************
 *函数名称:void ModeChoose(void)
 *函数功能:模式选择
 *入口参数:void
 *出口参数:void
 /
 void ModeChoose(void)
 {
 if(SOCAPI_GetTrackFreqStaus()==1) //追频成功标志
 {
 SOCAPI_SetFreq();
 WorkMode = WAITMODE; //进入工作模式
 TouchKeyInit(); //触摸按键初始化 //正常工作指示灯
 }
 else //第一次上电未追频
 {
 WorkMode = STOPMODE; //进入停机模式
 Power_Gear=0;
 }
 }
 /
 *函数名称:void main(void)
 *函数功能:主函数
 *入口参数:void
 *出口参数:void
 /
 void main()
 {
 P13=OFF; //上电先拉低PWM的输出
 Sys_Init(); //系统初始化
 ModeChoose(); //模式选择
 while(1)
 {
 if(btimer10ms1) //10ms扫描一轮
 {
 btimer10ms=0;
 WDTCR |=0x10; // 清狗
 if(!((WorkModeTRACKFREQ)|| (WorkMode==MAXGEAR))) //追频过程不处理按键
 {
 KeyScan();
 ChangeKeyValue();
 }
 LedScan();
 }
 switch(WorkMode)
 {
 case TRACKFREQ: //自动追频模式
 //
 SOCAPI_TrackFreq();
 if(TrackFreqFlag1)//追频完成标志置位
 {
 WorkMode= MAXGEAR;
 ADCCFG = ADCCFG|0x01; //选择参考电压2.4VDD,切换到测量电流
 ADCCR = 0x87; //打开ADC电源,选通P17通道
 AjustPowerFlag=0;
 }
 if(btime100ms1)
 {
 btime100ms=0;
 LED1Flag= ~LED1Flag;
 LED2Flag= ~LED2Flag;
 
 |