最近沒有什么產出,普通嚇得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獲得授權后發布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯系我們,謝謝!