当前位置:首页 > > 嵌入式大杂烩
[导读]最近没有什么产出,吓得ZhengN翻箱倒柜倒出一些小东西来发。下面分享一个ZhengN大二时候的一个小玩具,软硬件都分享给大家,有需要的小伙伴,文末获取。这个小作品设计到了强电,不建议没经验的小伙伴上手,了解了解即可。

最近没有什么产出,吓得ZhengN翻箱倒柜倒出一些小东西来发。下面分享一个ZhengN大二时候的一个小玩具,软硬件都分享给大家,有需要的小伙伴,文末获取。

这个小作品设计到了强电,不建议没经验的小伙伴上手,了解了解即可。

功能

用STM32控制一个普通灯泡的亮度,一路开关控制普通灯泡电源的通断,另外两路开关分别控制普通灯泡亮度的增加和减小。

调光控制器的原理

通过STM32控制双向可控硅的导通来实现白炽灯(纯阻负载)亮度的调整。双向可控硅的特点是导通后即使触发信号去掉,它仍将保持导通;当负载电流为零(交流电压过零点)时,它会自动关断。

所以需要在交流电的个半波期间都要送出触发信号,触发信号的送出时间就决定了灯泡的亮度。

调光的实现方式就是在过零点后一段时间才触发双向可控硅开关导通,这段时间越长,可控硅导通的时间越短,灯的亮度就越低;反之,灯就越亮。这就需要提取出交流电压的过零点,并以此为基础,确定触发信号的送出时间,达到调光的目的。

1、硬件

控制部分:主控单元以 STM32F103RBT6 单片机为核心,交流电压过零点信号提      取电路中产生的同步信号 TB 接到STM32F103RBT6 的 EXTI_Line0,此信号的下降沿将使 STM32F103RBT6 产生中断,以此为延时时间的起点。控制部分使用的是现有的最小系统板。

驱动部分:驱动部分主要由可控硅组成。可控硅在电路中能够实现交流电的无触点控制,以小电流控制大电流。动作快、寿命长、可靠性高。所以这里选用的是可控硅。驱动部分使用的是自己绘制的电路板,电路原理图:

负载部分:本电路智能控制纯阻负载白炽灯。

2、软件

要控制的对象是 50Hz 的正弦交流电,通过光耦取出其过零点的信号(同步信号),将这个信号送至单片机的外部中断,单片机接收到这个同步信号后启动一个延时程序,延时的具体时间由按键来改变。

当延时结束时,单片机产生触发信号,通过它让可控硅导通,电流过可控硅流过白炽灯,使灯发光。延时越长,亮的时间就越短,灯的亮度越暗(并不会有闪烁的感觉,因为重复的频率为 100Hz,且人的视觉有暂留效应)。由于延时的长短是由按键决定的,所以实际上就是按键控制了光的强弱。

经过实际调试得出,延时时间为0~7ms内的值。在程序中,我把7ms分割为14等份(实际上,分割的分数越大,调节的精度会更高,但是,为了有明显的现象,取14)。对于按键的处理,采用查询法,并且采用按下一次就响应一次的方法,即长按不能连续调整。

主程序:

左右滑动查看全部代码>>>

int main(void)
{
    GPIO_Configuration();
    USART_Configuration();
    EXTI_Configuration();
    PrintfLogo();
    Bright=14-z;          //亮度缺省值为7(通过调Z间接得到Bright)
    printf("当前亮度 = % d \r\n", Bright); 
    while(1)
    {
         //S1(PC6) 调高灯的亮度
        if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6) == Bit_RESET)
        {
            delay_ms(5);  //消除抖动
            if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6) == Bit_RESET)
            {
                z--;   
                //等待按键释放
                while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6) == Bit_RESET);  
                if(z==1)
                {
                   z=14;
                }
                Bright=14-z;
                printf("当前亮度 = % d \r\n", Bright);
             }
        }
        //S2(PC7) 调低灯的亮度
        if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7) == Bit_RESET)
        {
            delay_ms(5);  //消除抖动
            if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7) == Bit_RESET)
            {
                z++;  
                //等待按键释放
                while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7) == Bit_RESET);
                if (z==14)
                {
                    z=1;
                }
                Bright=14-z;
                printf("当前亮度 = % d \r\n", Bright);
            }
        }
        //S3(PC8) 调节灯的亮灭
        if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8) == Bit_RESET)
        { 
            delay_ms(5);  //消除抖动
            if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8) == Bit_RESET)
            {
                /*S3_Num为S3按下的次数,当按下的次数为奇数时灯灭
                当按下的次数为偶数时,灯亮,并且亮度值为默认值7*/

                S3_Num=S3_Num+1;
                //等待按键释放
                while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8) == Bit_RESET);
                if(S3_Num%2==1)
                {
                    __set_PRIMASK(1);  //关闭总中断,灯灭
                    printf("灯灭\r\n");
                }
                else
                {
                    __set_PRIMASK(0);  //打开总中断,灯亮
                    printf("灯亮,且亮度值为默认值% d \r\n", Bright); 
                }              
            }
        }
    }
}

外部中断函数:

void EXTI0_IRQHandler(void)
{
     if(EXTI_GetITStatus(EXTI_Line0)!=RESET)            
     {              
         delay_us(500*z);   //调节z的值来调节灯的亮度
         GPIO_ResetBits(GPIOC,GPIO_Pin_11);
         delay_us(100);
         GPIO_SetBits(GPIOC,GPIO_Pin_11);         
         EXTI_ClearITPendingBit(EXTI_Line0);
     }
}

验证:


【资料获取】公众号聊天界面回复调光控制器,进行获取


软硬结合是一件很酷的事情,虽然本公众号倾向于分享软件,但是ZhengN对硬件同样感兴趣。等到ZhengN软件学有所成之后再重新学习一些硬件知识,分享一些软硬结合的东西。玩嵌入式,是一辈子的事~

猜你喜欢

学习STM32的一些经验分享

我的单片机转嵌入式Linux之路


1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。在公众号聊天界面回复1024,即可免费获取!

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

随着现代家庭生活方式不断升级,厨房已不再只是功能空间,而逐渐成为融合审美表达、健康管理与智能体验的重要场域。消费者在关注空间整体性的同时,也对食材储存的安全性、洁净度以及使用便利性提出了更高要求。基于对中国家庭真实使用场...

关键字: 冰箱 嵌入式

在嵌入式系统、工业物联网等各类电子设备中,UART与网口是两种应用广泛的通信接口,前者作为经典的串行通信接口,承担着简单设备互联、调试日志传输等基础任务,后者则专注于高速、远距离的数据交互,是设备接入网络、实现大数据量传...

关键字: 嵌入式 通信接口 网口通讯

在单片机的世界里,“字节”(Byte)是一个贯穿始终的核心概念。从存储数据到执行指令,从变量定义到外设通信,字节无处不在。很多初学者在学习单片机时,往往更关注复杂的程序逻辑和外设驱动,却忽略了字节这个基础知识点,导致在后...

关键字: 单片机 字节

在单片机的数字逻辑中,我们通常最关注的是高电平和低电平两种状态,它们构成了二进制数字世界的基础。然而,除了这两种状态之外,还有一种至关重要但常常被忽视的状态——高阻态(High Impedance State)。高阻态就...

关键字: 单片机 高阻态

在软件开发领域,设计模式被誉为“解决特定问题的最佳实践”,但在嵌入式开发中,它却常常处于“边缘地带”。许多嵌入式工程师职业生涯中可能从未刻意使用过设计模式,甚至认为这些“软件工程理论”与单片机、传感器、实时系统等硬件紧密...

关键字: 嵌入式 设计模式

对于PIC入门者来说,不需要盲目追求高端开发板,一块功能均衡、资料丰富的入门款就能满足需求。比如Microchip官方推出的PIC16F84A开发板,它搭载经典的8位PIC内核,引脚布局清晰,自带LED、按键等基础外设,...

关键字: PIC 单片机

在居住结构持续演进与消费需求不断升级的背景下,中国家庭厨房正经历从“功能集合”向“系统空间”的深层转变。厨房不再只是烹饪的场所,而逐渐成为融合效率、健康、美学与家庭互动的重要生活空间。基于对这一趋势的长期洞察,西门子家电...

关键字: 嵌入式 蒸玲珑

该低功耗器件支持5V运行,在实现高性能的同时,能有效保障系统简洁性与成本效益

关键字: MCU 单片机 工业自动化

在物联网设备、工业控制系统和智能家居等嵌入式场景中,轻量级WEB服务器扮演着核心角色。它们不仅需要满足资源受限环境下的性能需求,还需兼顾安全性、可扩展性和开发效率。本文从资源占用、功能特性、适用场景三个维度,对比分析六大...

关键字: 嵌入式 WEB服务器

在嵌入式软件开发工具领域,一场悄然的变革正在发生。随着全球软件行业向订阅制转型,嵌入式软件开发工具的授权模式也迎来了重要调整。市场上的嵌入式软件开发工具基本可以分为三类:商用开发工具,开源开发工具和厂商私有开发工具,其中...

关键字: 嵌入式 MCU RISC-V
关闭