最近沒(méi)有什么產(chǎn)出,嚇得 ZhengN 翻箱倒柜倒出一些小東西來(lái)發(fā)。下面分享一個(gè) ZhengN 大二時(shí)候的一個(gè)小玩具,軟硬件都分享給大家,有需要的小伙伴,文末獲取。
這個(gè)小作品設(shè)計(jì)到了強(qiáng)電,不建議沒(méi)經(jīng)驗(yàn)的小伙伴上手,了解了解即可。
?
功能
用 STM32 控制一個(gè)普通燈泡的亮度,一路開(kāi)關(guān)控制普通燈泡電源的通斷,另外兩路開(kāi)關(guān)分別控制普通燈泡亮度的增加和減小。
?
調(diào)光控制器的原理
通過(guò) STM32 控制雙向可控硅的導(dǎo)通來(lái)實(shí)現(xiàn)白熾燈(純阻負(fù)載)亮度的調(diào)整。雙向可控硅的特點(diǎn)是導(dǎo)通后即使觸發(fā)信號(hào)去掉,它仍將保持導(dǎo)通;當(dāng)負(fù)載電流為零(交流電壓過(guò)零點(diǎn))時(shí),它會(huì)自動(dòng)關(guān)斷。
所以需要在交流電的個(gè)半波期間都要送出觸發(fā)信號(hào),觸發(fā)信號(hào)的送出時(shí)間就決定了燈泡的亮度。
調(diào)光的實(shí)現(xiàn)方式就是在過(guò)零點(diǎn)后一段時(shí)間才觸發(fā)雙向可控硅開(kāi)關(guān)導(dǎo)通,這段時(shí)間越長(zhǎng),可控硅導(dǎo)通的時(shí)間越短,燈的亮度就越低;反之,燈就越亮。這就需要提取出交流電壓的過(guò)零點(diǎn),并以此為基礎(chǔ),確定觸發(fā)信號(hào)的送出時(shí)間,達(dá)到調(diào)光的目的。
?
1、硬件
控制部分
:主控單元以 STM32F103RBT6 單片機(jī)為核心,交流電壓過(guò)零點(diǎn)信號(hào)提 ? ? ?取電路中產(chǎn)生的同步信號(hào) TB 接到 STM32F103RBT6 的 EXTI_Line0,此信號(hào)的下降沿將使 STM32F103RBT6 產(chǎn)生中斷,以此為延時(shí)時(shí)間的起點(diǎn)??刂撇糠质褂玫氖乾F(xiàn)有的最小系統(tǒng)板。
驅(qū)動(dòng)部分
:驅(qū)動(dòng)部分主要由可控硅組成??煽毓柙陔娐分心軌?qū)崿F(xiàn)交流電的無(wú)觸點(diǎn)控制,以小電流控制大電流。動(dòng)作快、壽命長(zhǎng)、可靠性高。所以這里選用的是可控硅。驅(qū)動(dòng)部分使用的是自己繪制的電路板,電路原理圖:
負(fù)載部分
:本電路智能控制純阻負(fù)載白熾燈。
?
2、軟件
要控制的對(duì)象是 50Hz 的正弦交流電,通過(guò)光耦取出其過(guò)零點(diǎn)的信號(hào)(同步信號(hào)),將這個(gè)信號(hào)送至單片機(jī)的外部中斷,單片機(jī)接收到這個(gè)同步信號(hào)后啟動(dòng)一個(gè)延時(shí)程序,延時(shí)的具體時(shí)間由按鍵來(lái)改變。
當(dāng)延時(shí)結(jié)束時(shí),單片機(jī)產(chǎn)生觸發(fā)信號(hào),通過(guò)它讓可控硅導(dǎo)通,電流過(guò)可控硅流過(guò)白熾燈,使燈發(fā)光。延時(shí)越長(zhǎng),亮的時(shí)間就越短,燈的亮度越暗(并不會(huì)有閃爍的感覺(jué),因?yàn)橹貜?fù)的頻率為 100Hz,且人的視覺(jué)有暫留效應(yīng))。由于延時(shí)的長(zhǎng)短是由按鍵決定的,所以實(shí)際上就是按鍵控制了光的強(qiáng)弱。
經(jīng)過(guò)實(shí)際調(diào)試得出,延時(shí)時(shí)間為 0~7ms 內(nèi)的值。在程序中,我把 7ms 分割為 14 等份(實(shí)際上,分割的分?jǐn)?shù)越大,調(diào)節(jié)的精度會(huì)更高,但是,為了有明顯的現(xiàn)象,取 14)。對(duì)于按鍵的處理,采用查詢(xún)法,并且采用按下一次就響應(yīng)一次的方法,即長(zhǎng)按不能連續(xù)調(diào)整。
主程序:
左右滑動(dòng)查看全部代碼>>>
int?main(void)
{
????GPIO_Configuration();
????USART_Configuration();
????EXTI_Configuration();
????PrintfLogo();
????Bright=14-z;??????????// 亮度缺省值為 7(通過(guò)調(diào) Z 間接得到 Bright)
????printf("當(dāng)前亮度?=?%?d?rn",?Bright);?
????while(1)
????{
?????????//S1(PC6)?調(diào)高燈的亮度
????????if(GPIO_ReadInputDataBit(GPIOC,?GPIO_Pin_6)?==?Bit_RESET)
????????{
????????????delay_ms(5);??// 消除抖動(dòng)
????????????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āng)前亮度?=?%?d?rn",?Bright);
?????????????}
????????}
????????//S2(PC7)?調(diào)低燈的亮度
????????if(GPIO_ReadInputDataBit(GPIOC,?GPIO_Pin_7)?==?Bit_RESET)
????????{
????????????delay_ms(5);??// 消除抖動(dòng)
????????????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āng)前亮度?=?%?d?rn",?Bright);
????????????}
????????}
????????//S3(PC8)?調(diào)節(jié)燈的亮滅
????????if(GPIO_ReadInputDataBit(GPIOC,?GPIO_Pin_8)?==?Bit_RESET)
????????{?
????????????delay_ms(5);??// 消除抖動(dòng)
????????????if(GPIO_ReadInputDataBit(GPIOC,?GPIO_Pin_8)?==?Bit_RESET)
????????????{
????????????????/*S3_Num 為 S3 按下的次數(shù),當(dāng)按下的次數(shù)為奇數(shù)時(shí)燈滅
????????????????當(dāng)按下的次數(shù)為偶數(shù)時(shí),燈亮,并且亮度值為默認(rèn)值 7*/
????????????????S3_Num=S3_Num+1;
????????????????// 等待按鍵釋放
????????????????while(GPIO_ReadInputDataBit(GPIOC,?GPIO_Pin_8)?==?Bit_RESET);
????????????????if(S3_Num%2==1)
????????????????{
????????????????????__set_PRIMASK(1);??// 關(guān)閉總中斷,燈滅
????????????????????printf("燈滅 rn");
????????????????}
????????????????else
????????????????{
????????????????????__set_PRIMASK(0);??// 打開(kāi)總中斷,燈亮
????????????????????printf("燈亮,且亮度值為默認(rèn)值%?d?rn",?Bright);?
????????????????}??????????????
????????????}
????????}
????}
}
外部中斷函數(shù):
void?EXTI0_IRQHandler(void)
{
?????if(EXTI_GetITStatus(EXTI_Line0)!=RESET)????????????
?????{??????????????
?????????delay_us(500*z);???// 調(diào)節(jié) z 的值來(lái)調(diào)節(jié)燈的亮度
?????????GPIO_ResetBits(GPIOC,GPIO_Pin_11);
?????????delay_us(100);
?????????GPIO_SetBits(GPIOC,GPIO_Pin_11);?????????
?????????EXTI_ClearITPendingBit(EXTI_Line0);
?????}
}
驗(yàn)證:
軟硬結(jié)合是一件很酷的事情,雖然本公眾號(hào)傾向于分享軟件,但是 ZhengN 對(duì)硬件同樣感興趣。等到 ZhengN 軟件學(xué)有所成之后再重新學(xué)習(xí)一些硬件知識(shí),分享一些軟硬結(jié)合的東西。玩嵌入式,是一輩子的事~