欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

大佬,萌新求指導,暑假剛學單片機,編程總是達不到想要的效果

查看數: 3431 | 評論數: 7 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2020-8-26 15:47

正文摘要:

我和學長自己做的一個小玩意,風控自動窗簾,使用微壓傳感器,但是我們的程序怎么調就是不能自動控制,我們是這樣設置的,信號輸入范圍3-5v電機run,1-2v電機frun,但是電機卻一直在轉,如果要實現這樣的效果,應該 ...

回復

ID:750684 發表于 2020-9-7 08:17
程序有點混亂,但是像這樣的為控制,大多是需要算法來進行調整的,譬如PID算法

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

ID:808485 發表于 2020-8-31 15:48
本帖最后由 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
                }
    }        
}


評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

ID:781556 發表于 2020-8-27 00:21
if語法應該沒什麼可說的,
關鍵是先確定傳感器的穩定性,漂移誤差範圍,
而後考慮是否可通過算法進行補償修正。
建議逐步監視跟蹤數據,以便鎖定問題所在,代碼 電路 器件都有可能。
A.驗證代碼建議移除傳感器,以固定信號進行觸發
B.驗證傳感器建議參考供應商範例。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

ID:391114 發表于 2020-8-26 22:57
程序有點混亂,但是像這樣的為控制,大多是需要算法來進行調整的,譬如PID算法
ID:805016 發表于 2020-8-26 20:05
wulin 發表于 2020-8-26 18:11
從樓主混亂不堪的代碼猜測:temp = Read_AD_Data(0xE4);獲取傳感器16位數據,解析temp后得到的信息來控制電 ...

大佬,萌新第一次寫代碼,很多地方都不太懂,我想請教一下您,


void Text_Init()
{
    if (disp[0]>=3 && disp[0] != text)
    {
          text = disp[0];
          flag = 1;


這個對比程序,跟下一次的程序對比,如果與上次的程序相同,電機不轉,反之亦然,我主要有一個疑惑,我的這個傳感器時有規律輸出信號,在一定范圍內波動,如果要實現理想情況,該采用什么樣的結構
ID:213173 發表于 2020-8-26 18:11
從樓主混亂不堪的代碼猜測: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)。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

ID:511890 發表于 2020-8-26 15:47
粗略看了下, 整個程序只有第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秒就能確定。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

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