![]() |
發布時間: 2024-12-30 16:46
正文摘要:用的是stc8g1k08a單片機,用p5.4口接5個按鍵,電壓分別是0.33v、1.18v、2.87v、3.79v、4.59v,想讓這幾個按鍵分別調光0、25%、50%、75%、100%,按鍵按下的時候可以執行此功能,但是過一會兒(有時幾秒有時一分鐘)就 ... |
lkc8210 發表于 2024-12-31 17:40 后面在電路中加了個電容解決了,只是不加按鍵消抖的話按鍵有時有點不靈敏,可能按鍵用久了也不太好用,加上消抖的話會有什么其他問題嗎,之前經常這樣用 ![]() |
coody_sz 發表于 2024-12-31 15:18 官方的電路是在官網看嗎 我只看到一個觸摸按鍵的演示視頻,還是是在論壇里面搜索呀 |
WL0123 發表于 2024-12-31 11:01 謝謝大神,加上電容確實解決了,只是不加軟件防抖的話有時按鍵會失靈,估計是按鍵也有點問題,加上軟件防抖的話會有其它什么問題嗎 |
zhuls 發表于 2024-12-31 11:00 確實在開機時會高亮一下,大神有沒有什么解決辦法,我試過在開機的時候讓IO口直接等于0,還是不行 |
的確里面的延時沒有任何意義
這樣看起來簡潔一些 |
WL0123 發表于 2024-12-31 15:41 之前好像是要先聲明才能使用的,但是現在的編譯器是可以這樣寫的。 |
1. adc_value 在Check_Keys()函數內是不變的,if()delay()if的多余的,不要死抄按鍵消抖 2. 主循環的set_duty_cycle(brightness)也很多余,Check_Keys()函數內有按鍵已經運行一次了,不用在主循環不斷運行 3. 可以試試中值濾波
|
zhuls 發表于 2024-12-31 13:46 你仔細看了樓主的代碼嗎? |
可以參考STC官方的ADC鍵盤電路,16個鍵的。 |
WL0123 發表于 2024-12-31 11:22 ![]() 你老師說的嗎? 還是你師傅教的? 或是你哪本書上看到的? 這好象說不過去啊,也不影響什么的。。 |
不宜在主循環內定義變量 // 主函數 void main(void) { int adc_value; P5M0 = 0x00; P5M1 = 0x10; // 設置P5.4為高阻輸入 P3M0 = 0x08; P3M1 = 0xf7; // P3.3為推挽輸出 System_Init(); light_init(); //使用定時器0作pwm功能 delay_ms(5); EA = 1; while (1) { adc_value = Read_ADC(); // 讀取ADC值 delay_ms(10); Check_Keys(adc_value); // 檢查按鍵 set_duty_cycle(brightness); } } |
stc8g1k08a有現成的硬件PWM不用?定時器中斷頻率過高有可能影響ADC。ADC連續采樣3次,拋棄前兩次數據,以第3次數據為準或連續采樣8-10次取平均值。ADC輸入端加1K電阻和102電容組成低通濾波。 Check_Keys函數去掉delay_ms(10),不需要軟件防抖。 |
AD按鍵串,要沒按鍵時,電壓確實是高的,約=于電源電壓。除非你的接法比較另類。 10bit的ADC,分5檔有4個節點,平均每節點相差256個計數,為了容錯,節點上下+-128個計數: 0檔<=128; 1檔<=384,>128; 2檔<=640,>384; 3檔<=896,>640; 4檔>896; 基實,人眼對光的敏感度并不是線性的,所以,“0、25%、50%、75%、100%”的值不一定適合。。 在數據處理時,0檔和4檔不需要輸出PWM,直接IO出低電平或出高電平; ADC在采樣時要有數字濾波比較好。 然后就是按鍵的接觸電阻要穩定、分壓電阻要穩定。。 === 我曾用電位器調整ADC的值,來控制PWM輸出實現無級調光,好用是好用,但發現有2個缺點, 就是在某些范圍內的占空比時,明顯看到燈會閃,不同的頻率周期,這個范圍也不盡相同, 可能軟件還要做個關于PWM的周期與占空比的適配。。 另一個問題是,只要配置了PWM,IO就輸出高電平,然后再按PWM配置輸出占空比, 表現為開機時燈會高亮一下,再按PWM顯示亮度。。 =====這是一個宿醉剛起、頭腦尚未完全清醒者的發言==== ====以內容上僅供參考,不負任何法律或道義上的責任==== |
首先Check_Keys中的delay_ms(10);沒什么作用,因為adc_value在Check_Keys運行時就不會改變,加上延遲指也是不會變的。然后Read_ADC沒做濾波,這兩個方面處理下應該好很多 |
官方的解釋是你的外圍電路做的不好 請按手冊來畫 |