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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4355|回復: 10
收起左側

主芯片用的是stc15系列的單片機,有一個邏輯關系,不知道能不能實現。

[復制鏈接]
ID:721008 發表于 2020-4-15 13:29 | 顯示全部樓層 |閱讀模式
我有一個邏輯關系,不知道能不能實現,用的是AD7606的采樣芯片,采樣芯片在第一次采集電壓值時啟動定時,定時時間為10秒,在這個十秒內,采樣芯片一直在采樣。然后我想實現的是,從第一次采樣到十秒結束,如果采樣芯片采集的電壓一直都是同樣的電壓,那么十秒結束后輸出一個信息到外部設備;如果采樣芯片在這十秒內采集到了另外一個電壓,那么定時立馬結束,跳出這個定時十秒的程序,輸出信息給外部設備。我試了延時程序和定時器定時,都沒有實現(不排除是程序的問題),本人單片機在入門中,還請大神指點,謝謝。
回復

使用道具 舉報

ID:94031 發表于 2020-4-15 14:31 | 顯示全部樓層
AD采樣每次都不一樣,是在一定范圍波動的,這個情況你得注意。
回復

使用道具 舉報

ID:94031 發表于 2020-4-15 14:35 | 顯示全部樓層
不如你把最后想實現的過程說清楚,不一定要你現在的思路。
回復

使用道具 舉報

ID:584814 發表于 2020-4-15 14:46 | 顯示全部樓層
立馬結束跳出的,在編程中一般稱作為中斷,可自行百度。
回復

使用道具 舉報

ID:282850 發表于 2020-4-15 15:10 | 顯示全部樓層
這個問題有點水平,說明樓主善于思考,試回答:
1、采樣芯片采集的電壓一直都是同樣的電壓,需保證相同,AD的值本來就有很小的變化的,要考慮取幾位有效數來比對。
2、延時程序本身與執行是相沖突的,重寫延時程序,在延時程序里加入AD采樣及跳出程序,可能也可以實現
3、定時器定時,我一般采用中斷方式,邏輯與你想要的不對。如果在主程序中反復讀TA值,并if,估計能實現。
回復

使用道具 舉報

ID:452950 發表于 2020-4-15 15:54 | 顯示全部樓層
假設采樣頻率為100MS一次,就可以設置循環條件,采樣100次即為10s,若檢測到與上次不一樣則提前跳出。注意要考慮采樣過程消耗的時間,若相對采樣間隔時間較大,則需要計算,使延時時間和采樣持續時間合計等于采樣間隔時間。
uchar i=0,j=0,k=0;
while(i<100)
{
j=采樣函數();if((k!=j)&&(i>0))break;
k=j;
i++;
delay(100);//延時100ms
}
輸出j和k();//如果有變化,j為后者,k為前者;如果無變化,采樣100次后兩者一致

回復

使用道具 舉報

ID:213173 發表于 2020-4-15 18:33 | 顯示全部樓層
實現樓主想要的功能沒有問題。問題是樓主指的同樣的電壓與另外一個電壓怎么定義,波動范圍是多少?
回復

使用道具 舉報

ID:452950 發表于 2020-4-15 18:50 | 顯示全部樓層
采樣范圍可以在采樣函數里面處理,根據精度需求給采樣得到的不同數值范圍分級,將范圍轉化成級數,只輸出級數就可以了。
回復

使用道具 舉報

ID:388197 發表于 2020-4-15 22:41 | 顯示全部樓層
僅作邏輯參考,代碼隨便敲的,難免遺漏個括號分號什么的.

#define Range 5                 //采樣值范圍(因為每次采樣都有細小的波動)小于這個值則認為值無變化
u8 FlagSample = 0;             //采樣標志.
u8 FlagChange = 0;            //在采樣時間內采樣值是否有變化標志
u16 Timer = 0;                  //計時變量
u16 First_Adc_Value = 0;   //首次采樣值
u16 Value = 0;                  //其他采樣值

u16 Get_Adc_Value()        //ADC采樣,返回值為采樣值
{
    ..........
}
main()
{
    .....
    .....
   if(需要采樣)
   {
       FlagSample = 1;
       First_Adc_Value = Get_Adc_Value();     //首次采樣
       while(FlagSample == 1)
       {
            Value = Get_Adc_Value();
            FlagChagnge = 0;                          //清值變化標志
            if(Value == First_Adc_Value)          //如果相等則繼續
           {
                continue;
           }else   if(First_Adc_Value > Value)   //如果首次采樣大于期間采樣
           {
                 if(First_Adc_Value - Value  < Range)  //如果兩者相差小于設定范圍
                 {
                       continue;                           //則認為二者相等,繼續循環.
                 }else                                       //否則(兩者相差大于5)則認為值有變化
                {
                       FlagSample = 0;                //關掉采樣標志
                       Timer = 0;                        //定時清0,方便下次使用
                       FlagChange = 1;                //將有變化標志置1,表示有變化
                       break;
                }
           }else  if(First_Adc_Value < Value)    //如果首次采樣小于期間采樣
            {
                 ...我就不寫了...照著上面依次類推就好了....
            }
       }
       if(FlagChange == 1)
       {
                輸出值變了
       }else
      {
                輸出值沒變
      }
   }
}

void T0_ISR()      interrupt 1  定時器中斷函數,假設是1ms中斷
{
     ....
    .....
     if(FlagSample == 1)
     {
          Timer ++;
          if(Timer >= 10000)        // 10秒
          {
              Timer = 0;
              FlagSample = 0;
          }
     }else
     {
          Timer = 0;
     }
}
回復

使用道具 舉報

ID:721008 發表于 2020-4-16 10:26 | 顯示全部樓層
wulin 發表于 2020-4-15 18:33
實現樓主想要的功能沒有問題。問題是樓主指的同樣的電壓與另外一個電壓怎么定義,波動范圍是多少?

是這樣的,我這個主要是為了測量電流傳感器的,在采樣電阻前端采集電壓值,電壓值只有兩個狀態,一個狀態的電壓范圍是0.6~0.8V,另外一個狀態的電壓范圍是1.3~.5V.
回復

使用道具 舉報

ID:213173 發表于 2020-4-16 13:55 | 顯示全部樓層
ADMIN_ALLENY 發表于 2020-4-16 10:26
是這樣的,我這個主要是為了測量電流傳感器的,在采樣電阻前端采集電壓值,電壓值只有兩個狀態,一個狀態 ...

給你寫一個編程思路,具體應用還要擴展完善。
以STC15系列為依據
void Timer0Init()        //50毫秒@12.000MHz
{
        AUXR &= 0x7F;        //定時器時鐘12T模式 16位自動重裝
        TMOD &= 0xF0;        //設置定時器模式
        TL0 = 0xB0;                //設置定時初值
        TH0 = 0x3C;                //設置定時初值
        TF0 = 0;                //清除TF0標志
        TR0 = 1;                //定時器0開始計時
        EA  = 1;                //開總中斷
        ET0 = 1;                //開T0中斷
}

void Timer0Interrupt() interrupt 1
{
        if(flag)                                        //啟動檢測
        {
                num++;                                        //計時
                Vin=GetADCResult(ch);        //讀取ADC輸入信號電壓轉換值
                                                                //電壓范圍0~VCC Vin=0~1023
                if(Vin<Vin_L||Vin>Vin_H)//判斷電壓范圍
                {
                        sign_A=1;                        //輸出信號1
                        flag=0;                                //清0啟動標志
                        num=0;                                //清0計數變量
                }
                if(num>=200)                        //10秒到 結束
                {
                        sign_B=1;                        //輸出信號2
                        flag=0;                                //清0啟動標志
                        num=0;                                //清0計數變量
                }
        }
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

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