![]() |
發布時間: 2020-8-26 15:47
正文摘要:我和學長自己做的一個小玩意,風控自動窗簾,使用微壓傳感器,但是我們的程序怎么調就是不能自動控制,我們是這樣設置的,信號輸入范圍3-5v電機run,1-2v電機frun,但是電機卻一直在轉,如果要實現這樣的效果,應該 ... |
本帖最后由 gbchang 于 2020-8-31 15:53 編輯 “信號輸入范圍3-5v電機run,1-2v電機frun,但是電機卻一直在轉” 我大膽猜測補充一下邏輯要求: 傳感器3~5V時,電機正轉,1~2V時,電機反轉,傳感器其它數值時,電機停止 進一步猜測應用場景: 根據風壓控制窗簾開閉,起大風時,為了防止刮壞窗簾,打開窗簾(只需要開一次就好),風小了太陽出來了,關窗簾防曬,同樣也只需要關一次 所以,開和閉應該是有一個制約關系的。開-關-開-關...,交替進行 在充分尊重原作者程序思想前提下,主程序邏輯增加制約條件,即交替因素: void Text_Init() { if (disp[0]>=3 && disp[0] != text) {//風壓變化,且大于3V text = disp[0]; flag = 1; //請求開窗簾 } } void Text_Init1() { if (disp[0]<=2 && disp[0] != text) {//風壓變化,且小于2V text = disp[0]; flag = 0; //請求閉窗簾 } } void main() { while(1) { datapros(); //數據處理函數 DigDisplay(); Text_Init(); Text_Init1(); if( flag1 == 0 && flag == 1 ) {//窗簾處于閉合狀態,有開啟請求 run(); flag1 = 1; //窗簾已經打開,記錄狀態為1 } else if( flag1 == 1 && flag == 0 ) {//窗簾處于開啟狀態,有閉合請求 frun(); flag1 = 0; //窗簾已經閉合,記錄狀態為0 } } } |
程序有點混亂,但是像這樣的為控制,大多是需要算法來進行調整的,譬如PID算法 |
wulin 發表于 2020-8-26 18:11 大佬,萌新第一次寫代碼,很多地方都不太懂,我想請教一下您, void Text_Init() { if (disp[0]>=3 && disp[0] != text) { text = disp[0]; flag = 1; 這個對比程序,跟下一次的程序對比,如果與上次的程序相同,電機不轉,反之亦然,我主要有一個疑惑,我的這個傳感器時有規律輸出信號,在一定范圍內波動,如果要實現理想情況,該采用什么樣的結構 |
從樓主混亂不堪的代碼猜測:temp = Read_AD_Data(0xE4);獲取傳感器16位數據,解析temp后得到的信息來控制電機。可是“disp[1]=smgduan[temp%1000/100];//百位”這樣的代碼提取的信息只能供數碼管顯示用,其數據內容已經面目全非了,根本不可能用做后續判斷條件 if (disp[0]>=3 && disp[0] != text) 。如果要提取temp的百位數據用于判斷應當是 if((temp/100%10)>=3 && (temp/100%10) != text)。 |
粗略看了下, 整個程序只有第75行 disp[0]=1;//千位 對 disp[0]進行過操作,所以整個程序運行過程中, disp[0]永遠等于1。小于3,所以while中的if循環永遠只能進第二分支。 由于disp[0] =1 ,所以Text_Init()中的if語句里面的語句不會被執行。執行的是Text_Init1() void Text_Init1() { if (disp[0]<3 && disp[0] != text)//由于disp[0]=1,text =0,所以判斷通過,執行以下程序 { text = disp[0]; flag1 = 1; } } 到這里得到flag=0,flag1=1,所以程序執行 if(disp[0]<3) { if(disp[0]<3) { if(flag1=1) { run(); flag1= 0; } 執行一次后就不再執行。 至于你說的電機一直在轉,這個有兩種可能,一種是硬件電路有問題。另一種的當IN1=IN2=0時電機運行,等于1時電機不轉。要確定這種情況只要看下程序剛開始運行時有一個電機停止5秒就能確定。 |