本帖最后由 聪聪哥哥 于 2025-7-6 16:16 编辑
借着本次对CH32单片机的机会,制作一个简单的智能家居的控制系统;
前言:智能家居的设计需求:
智能家居的研究背景是随着科技的发展和人们生活水平的提高而逐渐形成的。智能家居指的是通过智能化技术,将家庭设备、家居系统.
家居娱乐等进行有机整合,实现家居环境的智能化管理,提升家居生活的舒适度、便利性、安全性和节能性。
智能家居的发展已经成为智慧城市建设的重要组成部分,是未来智慧生活的重要方向之一。智能家居的意义在于:
1.提升生活品质:智能家居可以帮助人们更加轻松地管理家庭设备,提高生活品质,使家居环境更加舒适和便利。
2.促进能源节约:智能家居可以通过智能化管理,实现家庭能源的节约和环保。
3.提高家庭安全:智能家居可以通过智能化安防系统、自动化门锁等,提高家庭安全性,降低家庭安全风险
4.推动产业升级:智能家居产业的发展可以推动智慧城市的建设,促进相关产业的升级,带动经济的发展。
5.促进家庭交流:智能家居可以通过智能化娱乐系统、智能音频等技术,让家庭成员更加便捷地交流和互动,增强家庭情感。
生活效率与便利性:
现代人生活节奏加快,对自动化、远程控制(如手机App操控家电)的需求增长。
人口老龄化与健康关注:
智能家居可集成健康监测(如跌倒检测、空气质量管理),满足老年人和健康管理的需求。
安全与隐私意识:
智能安防(如摄像头、门锁、烟雾报警)成为家庭刚需。
一:卧室内小夜灯的设计思路: 使用CH32的外部中断的来监测有人进入卧室,通过高级定时器实现灯光的亮度调节。
二:CH32高级定时器知识分享
2.1 高级定时器个数:
高级定时器模块包含一个功能强大的 16 位自动重装定时器(TIM1、TIM8、TIM9 和TIM10),可用于测量脉冲宽度或产生脉冲、PWM 波等。用于电机控制、电源等领域。
可见,CH32F207共计4哥高级定时器,均为16位定时器,在使用的过程中,注意重装值不要越界。
2.2 高级定时器的特征:
位预分频器,分频系数从1~65536 之间动态可调;
支持四路独立的比较捕获通道;
每路比较捕获通道支持多种工作模式,比如:输入捕获,输出比较,PWM生成和单脉冲输出;
支持可编程死区时间的互补输出;
支持外部信号控制定时器;
支持使用重复计数器在确定周期后更新定时器:
支持使用刹车信号将定时器复位或置其于确定状态;
支持在多种模式下使用 DMA;
支持增量式编码器;
支持定时器之间的级联和同步
在本次项目中,使用定时器的PWM生成功能,完成本次项目的基本内容;PWM输出模式介绍:
PWM 输出模式是定时器的基本功能之一。
PWM 输出模式最常见的是使用重装值确定 PWM 频率,使用捕获比较寄存器确定占空比的方法。将 0CxM 域中置 110b 或 111b 使用 PWM 模式 1 或模式 2,置0CxPE 位使能预装载寄存器,最后置 ARPE 位使能预装载寄存器的自动重装载。由于在发生一个更新事件时,预装载寄存器的值才能被送到影子寄存器,所以在核心计数器开始计数之前,需要置 UG 位来初始化所有寄存器。在 PWM 模式下,核心计数器和比较捕获寄存器一直在进行比较,根据 CMS 位,定时器能够输出边沿对齐或中央对齐的 PWM 信号。
边沿对齐使用边沿对齐时,核心计数器增计数或减计数,在 PWM 模式1的情景下,在核心计数器的值大于比较捕获寄存器时,0CxREF 为高;当核心计数器的值小于比较捕获寄存器时(比如核心计数器增长到R16 TIMX ATRLR 的值而恢复成全0时),0CxREF 为低。
中央对齐使用中央对齐模式时,核心计数器运行在增计数和减计数交替进行的模式下,0CxREF 在核心计数器和比较捕获寄存器的值一致时进行上升和下降的跳变。但比较标志在三种中央对齐模式下,置位的时机有所不同。在使用中央对齐模式时,最好在启动核心计数器之前产生一个软件更新标志(置 UG位)
三:中断知识分享:
系统可以通过唤醒事件来唤醒由 WFE 指令引起的睡眠模式。唤醒事件通过以下两种配置产生
1:在外设的寄存器里使能一个中断,但不在内核的 NVIC或 PFIC 里使能这个中断,同时在内核里使能 SEVONPEND 位。体现在 EXTㄧ 中,就是使能 EXTㄧ 中断,但不在 NVIC或 PFIC 中使能 EXTI 中断,同时使能 SEVONPEND 位。当 CPU 从 WFE 中唤醒后,需要清除 EXTI 的中断标志位和 NVIC 或 PFIC挂起位。
2:使能一个 EXTI 通道为事件通道,CPU 从 WFE 唤醒后无需清除中断标志位和 NVIC 或 PFIC 挂起位的操作。
四:实物连接图如下所示:
这里使用定时器的输出功能,为了进行简单的演示,这里是需要将定时器的输出引脚PA8接入MOS管的控制引脚即可,从而实现脉宽的配置。
五:代码分享:
5.1程序流程图如下所示:
5.2高级定时器1 初始化的配置如下:
void TIM1_PWMOut_Init( u16 arr, u16 psc, u16 ccp )
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
TIM_OCInitTypeDef TIM_OCInitStructure = {0};
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure = {0};
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStructure );
TIM_TimeBaseInitStructure.TIM_Period = arr;
TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure );
#if (PWM_MODE == PWM_MODE1)
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
#elif (PWM_MODE == PWM_MODE2)
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
#endif
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = ccp;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init( TIM1, &TIM_OCInitStructure );
TIM_CtrlPWMOutputs( TIM1, ENABLE );
TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Disable );
TIM_ARRPreloadConfig( TIM1, ENABLE );
TIM_Cmd( TIM1, ENABLE );
}
主函数如下所示:
TIM1_PWMOut_Init( 100-1, 480 -1, 50-1 );
在程序初始化,之前将频率配置2K,如下所示
在配置的时候,需要注意下,由于重装值,预分配系数,和比较值,是从0开始计数的,所以这里需要将设定值减去1,否则会导致输出的频率出现误差。
5.3使用延时函数完成对小夜灯灯光的控制;
temp= temp + 5 ;
if( temp>=100) temp = 5 ;
TIM1_PWMOut_Init( 100-1, 480 - 1, temp -1);
Delay_Ms(100);
使用简单的代码,就实现灯光亮度的控制。
六:实物验证:
后记:使用CH32 库函数进行二次开发,上手简单,可以进行项目的快速验证。运用PWM的脉宽控制部分,可以方便的对小夜灯的亮度进行调节,视频中为了方便看到效果,将调试周期和脉宽设置较快,主要是为了看到实际的效果,后期加上光敏模块,可以实现夜间的灯光控制。
|