找回密碼
 立即註冊
搜索
查看: 8147|回復: 5

修理潛水電筒(加程序及圖片)

[複製鏈接]
發表於 21-5-2012 00:26:11 | 顯示全部樓層 |閱讀模式
解體後的電筒.jpg

收到一個壞的 LED 潛水電筒,經檢查是死了兩個鋰電池及 PIC12C518,因程序是在 CPU 內置的,所以要重寫,而手上只有 STC15F104E 才可夠細小放入電筒內(有8個接腳的 DIP 及 SOP 供選擇)。但接腳不同,寫好 CPU 再考慮怎樣安裝吧。

此電筒使用一個磁控管做選擇掣: 關閉、低光、中光及全光等光度控制。


ReedBounce.jpg

因未試過用磁控管做開關,所以用示波器看一看開合的情形。原本以為有磁性的關係彈跳現象不會太利害,但測量後發現是遠超想像,竟然有足足50mS。還有更長時間的,但捕捉不到。暫定 debounce time 為 100mS。

推動 LED 的 3 個類似 FET 的零件中,只有 IRF7450 能夠分辨,其餘兩個都只用包裝編號,所以不知道是什麼型號,只是經過測試後確定 LED 是高電位點亮的。

跟著要寫軟件了,完成後傳上來給大家參考。
發表於 22-5-2012 20:14:37 | 顯示全部樓層
cho,


多謝你分享你的經驗,很多時用開關掣接上數位電路時,都會遇上這些問題,可以改編程還好(起碼暫時不用更換開關掣),我最近遇上類似的問題,就是滑鼠的按鍵,日子久了,微動掣內部彈簧片腳震震,經常被電路誤會為 "雙擊",認真痲煩,昨天剛在 RS 訂了些微動掣,要等貨到才有得搞。


 樓主| 發表於 29-5-2012 19:42:47 | 顯示全部樓層
程序已完成及測試後反應良好,傳上來給大家參詳指教:

STC15F104E 只有 2 個普通時鐘可用,所以要寫個模擬 PWM 的軟件。
先定下 PWM 的頻率為 2kHz,選系統頻率為 10MHz,由此計算到每周期分為 5000 格。低光度用 25% 脈寬,中光度用 50% 脈寬,高光度是全亮,程序如下:

此程序非常簡單, 只使用兩個中斷:PWM 用計時器 0, 磁控管接外部中斷 1
/**************************************************************
PROGRAM NAME    :Torch.c
DESCRIPTION          :A program to control a torch with
                                 :4 levels of brightness -- off-low-mid-high
MCU                         :STC15F104E
FREQUENCY           :Internal RC osc 10MHz
MODIFTY DATE     :2012/05/24
**************************************************************/
1   #include <reg51.h>
2   #include <intrins.h>
3
4   #define LightOff PWMOut=0        //low to turn off the light
5   #define LightOn PWMOut=1        //high to turn on the light
6
7   sfr P3M0 = 0xb2;
8   sfr AUXR = 0x8e;
9   sbit PWMOut = P3^2;
10  sbit KeyIn = P3^3;
11
12  //PWM frequency = 2KHz, so total count of a cycle is 5000
13  code int Brightness[2][2] = {{3750, 1250}, {2500, 2500}};
14  char BrightnessL[4];
15  char BrightnessH[4];
16  char LightLevel;                        //0=off 1=low 2=mid 3=high
17
18  void Delay(unsigned int Times);
19
20  void main(void)
21  {
22           BrightnessL[0] = (65536 - Brightness[0][0]) % 256;
23           BrightnessH[0] = (65536 - Brightness[0][0]) / 256;
24           BrightnessL[1] = (65536 - Brightness[0][1]) % 256;
25           BrightnessH[1] = (65536 - Brightness[0][1]) / 256;
26           BrightnessL[2] = (65536 - Brightness[1][0]) % 256;
27           BrightnessH[2] = (65536 - Brightness[1][0]) / 256;
28           BrightnessL[3] = (65536 - Brightness[1][1]) % 256;
29           BrightnessH[3] = (65536 - Brightness[1][1]) / 256;
30
31           KeyIn = 1;
32           LightLevel = 0;                //light off when power on
33           PWMOut = 0;
34           AUXR = 0x80;                //set Timer0 to 1T
35           P3M0 = 0x04;                //set P3.2 to PP for output
36
37           //Timer0 init
38           TMOD = 0x01;                //set timer0 to 16-bit counter
39           IT1 = 1;                        //set int1 falling only
40           IE = 0xc6;                          //set bit EA, ELVD, EX1, ET0
41           PT0 = 1;
42
43           PCON = 0x02;
44           _nop_();
45           _nop_();
46           _nop_();
47           while(1);
48  }
49
50  void Timer0Int(void) interrupt 1
51  {
52           switch (LightLevel)
53           {
54                   case 1:
55                   if (PWMOut)
56                   {
57                           PWMOut = 0;
58                           TL0 = BrightnessL[0];
59                           TH0 = BrightnessH[0];
60                   }
61                   else
62                   {
63                           PWMOut = 1;
64                           TL0 = BrightnessL[1];
65                           TH0 = BrightnessH[1];
66                   }
67                   break;
68               
69                   case 2:
70                   if (PWMOut)
71                   {
72                           PWMOut = 0;
73                           TL0 = BrightnessL[2];
74                           TH0 = BrightnessH[2];
75                   }
76                   else
77                   {
78                           PWMOut = 1;
79                           TL0 = BrightnessL[3];
80                           TH0 = BrightnessH[3];
81                   }
82                   break;
83               
84                   case 3:
85                   LightOn;
86                   TR0 = 0;
87           }
88  }
89
90  void Ex1Int(void) interrupt 2
91  {
92           EX1 = 0;
93           Delay(7000);                //debounce about 100mS
94           if (!KeyIn)
95           {
96                   LightLevel++;
97                   if (LightLevel > 3)
98                   {
99                           LightLevel = 0;
100                          TR0 = 0;
101                          EX1 = 1;
102                          LightOff;
103                       
104                          PCON = 0x02;
104                          _nop_();
105                          _nop_();
106                          _nop_();
107                          _nop_();
108                  }
109                  TR0 = 1;
110
111                  while (!KeyIn);        //wait switch release
112                  Delay(7000);
113          }
114          IE0 = 0;
115          EX1 = 1;
116  }
117
118  void Delay(unsigned int Times)
119  {
120          unsigned int i;
121          for (i = 0; i < Times; i++);
122  }


程序說明:
13 行         宣告 PWM 的兩組控制光度的參數,第 1 組是 25% 寬度,第2組是 50% 寬度
22~29 行  因懶惰將PWM的數據交編譯器計算成計時器使用的數據
43 行           電源接通後先進入電源下降模式
47 行        初始工作完成後,進入無限迴圈
50 行        時鐘0中斷程式,視變數 LightLevel 的數值,作控制 PWM 寬度用
90 行        磁控管輸入中斷程式,可看到 LightLevel = 0時,電筒進入電源下降模式
 樓主| 發表於 31-5-2012 21:09:08 | 顯示全部樓層
測試時拍下 MCU 輸出的照片

25%Signal.jpg

50%Signal.jpg
 樓主| 發表於 31-5-2012 21:28:21 | 顯示全部樓層
MCU 安裝在底板的情況:{:soso_e104:}

單片機的近照.jpg


另一角度的 MCU 安裝照片:{:soso_e113:}

背部加裝的單片機及走線.jpg


蓋上底蓋就完成啦{:soso_e100:}

只欠最後工序.jpg


重見光明啦!恭喜{:soso_e182:}

重生的電筒.jpg

發表於 1-6-2012 21:21:25 | 顯示全部樓層
佩服,佩服。{:soso_e179:}
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

手機版|小黑屋|存檔|中華業餘無線電研究會網站

GMT+8, 4-5-2024 05:44 , Processed in 0.041889 second(s), 23 queries , Gzip On.

本討論區基於 Discuz! X3.5

版權所有 © 2001-2024 中華業餘無線電研究會有限公司,保留一切權利


重要聲明:本討論區是以即時上載留言的方式運作,中華業餘無線電研究會對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,讀者及用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,讀者及用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者及用戶發現有留言出現問題,請聯絡我們。中華業餘無線電研究會有權刪除任何留言及拒絕任何人士上載留言(刪除前或不會作事先警告及通知),同時亦有不刪除留言的權利,如有任何爭議,管理員擁有最終的詮釋權。用戶切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。

快速回復 返回頂部 返回列表