电路原理图如下:
单片机源程序如下:
/*******************************************************************************文件名: 真空泵控制板(超低功耗,9V集成电池待机3个月后唤醒)主控程序 编 写: 李工/Michael Lee 单 位: 领岸 时 间: 2023年06月17日 修 改: 版 本: V1.0 备 注: 1.时钟选择MCU内部5MHz IMOSC振荡器; 2.接口说明: APT32F1023B-24PIN ----- 外部设备 ******************* LED指示灯 ****************** PB0.3 ----- LED ******************* 真空泵 ****************** PA0.0 ----- DC直流电机 3.MCU上电后使用默认IMOSC时钟完成软硬件初始化设置,初始化完毕后系统仍选择 此时钟作为主时钟(5分频),以降低功耗(实测电流500uA左右); 4.由于MCU选择内部IMOSC作为主时钟,下载仿真器注意要设置ICE Clock<1000KHz; 5.MCU上电后(自锁按键开关),先启动真空泵(DC直流电机)工作10秒钟,再初 始化RTC并低功耗运行,然后MCU进入深度休眠模式,RTC每隔3个月(测试时间设 为3小时)唤醒一次MCU,并启动真空泵工作10秒钟后再次进入深度休眠模式,以 此循环,直至电池供电耗尽(实测RTC运行时整机待机功耗5.6uA,其中MCU待机功 耗3.5uA左右,稳压LDO为HT7550-3,SOT-89封装,LDO空载功耗0.87uA); 6.免费申请APT32系列单片机/MCU下载仿真器、学习板及FAE技术支持、软硬件 开发咨询等请联系:18823326651(李工,微信同号)、274915968@qq.com *******************************************************************************/ //加载头文件 #include "sys_clk.h" #include "iostring.h" #include "csp.h" #include "pm.h" #include "rtc.h" #include <string.h> #include <drv/gpio.h> #include <drv/pin.h> #include "low_power.h" //加载MCU低功耗设置等操作头文件 #include "rtc_time.h" //加载RTC初始化等操作头文件 //宏定义 /*** 变量类型 ***/ #define uchar unsigned char #define uint unsigned int #define ushort unsigned short #define ulong unsigned long /*** LED指示灯 ***/ #define LED_ON csi_pin_set_high(PB03) //点亮LED指示灯(PB03端口输出高电平) #define LED_OFF csi_pin_set_low(PB03) //熄灭LED指示灯(PB03端口输出低电平) /*** 直流电机真空泵 ***/ #define Pump_ON csi_pin_set_high(PA00) //开启真空泵(PA00端口输出高电平) #define Pump_OFF csi_pin_set_low(PA00) //关闭真空泵(PA00端口输出低电平) //外部函数 /*** 系统启动 ***/ extern void system_init(void); extern void board_init(void); //主函数标志位 uchar Pump_First_Start = 0; //定义、保存上电真空泵首次启动标志位 //主函数变量 uint Wake_Up_Times = 0; //定义、保存MCU低功耗唤醒次数 //外部变量 /********** GPIO口初始化操作 ***********/ /******************************************************************************* 函数名: GPIO_Init() 功 能: GPIO口初始化 参 数: 无 返回值: 无 *******************************************************************************/ void GPIO_Init(void) { //LED指示灯 csi_pin_set_mux(PB03,PB03_OUTPUT); //配置PB0.3端口为输出模式 csi_pin_output_mode(PB03, GPIO_PUSH_PULL); //推挽输出 //直流电机真空泵 csi_pin_set_mux(PA00,PA00_OUTPUT); //配置PA0.0端口为输出模式 csi_pin_output_mode(PA00, GPIO_PUSH_PULL); //推挽输出 //主频CLO输出 // csi_pin_set_mux(PA02, PA02_CLO); //设置主频输出引脚为PA0.2脚 // csi_clo_config(CLO_SYSCLK, CLO_DIV8); //CLO分频系数为8,输出频率=主频48MHz/8=6MHz } /********** 其他操作函数 ***********/ /******************************************************************************* 函数名: Pump_Run() 功 能: 直流电机真空泵启动10秒左右,并且LED闪烁提示 参 数: 无 返回值: 无 *******************************************************************************/ void Pump_Run(void) { uint i; //定义临时变量,方便后续程序使用 Pump_ON; //启动直流电机真空泵 for(i=0;i<18;i++) //LED指示灯闪烁,并循环延时10秒 { LED_ON; //点亮LED指示灯 mdelay(300); //延时 LED_OFF; //熄灭LED指示灯 mdelay(300); //延时 } Pump_OFF; //关闭直流电机真空泵 } //主函数 int main() { //系统、GPIO口等初始化 system_init(); //系统时钟、TICK等配置(系统时钟5MHz 5分频) // board_init(); //UART2硬件串口等配置(系统打印参数用) GPIO_Init(); //GPIO口初始化 RTC_Init(); //RTC时钟初始化 Low_Power_Set(); //MCU低功耗设置 //主循环 while(1) { //真空泵首次上电,启动10秒左右,并且LED闪烁提示(MCU被唤醒后也从此处开始执行程序) if(Pump_First_Start==0) { Pump_Run(); //真空泵运行 Pump_First_Start = 1; //上电真空泵首次启动标志位置1 } //MCU深度休眠被RTC中断唤醒,判断延时时间到后,真空泵启动10秒左右,并且LED闪烁提示 else { Wake_Up_Times++; //RTC中断唤醒计时次数+1 if(Wake_Up_Times>5) //延时时间达到:5*1min=5min { Wake_Up_Times = 0; //清零RTC中断唤醒计时次数 Pump_Run(); //真空泵运行 } } //MCU进入深度睡眠状态 csi_pm_enter_sleep(PM_MODE_DEEPSLEEP); //MCU选择进入深度睡眠运行状态 } return 0; }
复制代码