久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6449|回復: 15
收起左側

關于ADC0832采集電壓的范圍

[復制鏈接]
ID:549426 發表于 2020-11-10 20:15 | 顯示全部樓層 |閱讀模式
如果采集的電壓不在0-5V,電壓是-1v-3v,這種程序應該怎么寫,或者這個電壓在0-1v這個程序又該怎么寫,謝謝!
回復

使用道具 舉報

ID:213173 發表于 2020-11-11 07:51 | 顯示全部樓層
如果采集的電壓不在0~VCC范圍,假設是±1.5V,可以通過雙電源運放轉換到0~VCC。采集到的ADC數據通過運算就可以顯示正負值。
回復

使用道具 舉報

ID:549426 發表于 2020-11-12 23:23 | 顯示全部樓層
wulin 發表于 2020-11-11 07:51
如果采集的電壓不在0~VCC范圍,假設是±1.5V,可以通過雙電源運放轉換到0~VCC。采集到的ADC數據通過運算就 ...

現在在做一個PM2.5檢測系統,目前在網上查詢到的很多都是用夏普模塊做的,現在我手上拿到的模塊,初始無塵電壓是0.2v,而夏普的電壓是0.9v,看了別人的算法是:
            DUST=Error_Correct(ADC_Get,10);
            DUST_Value=(DUST/256.0)*5;//轉化成電壓值
            DUST_Value=(DUST_Value*0.17-0.1)*1000;//固體懸浮顆粒濃度計
里面這個算法公式電壓值乘0.17在減0.1是怎么來的,如果我要換成自己手里的模塊,公式應該怎么變換,謝謝
回復

使用道具 舉報

ID:549426 發表于 2020-11-12 23:29 | 顯示全部樓層
wulin 發表于 2020-11-11 07:51
如果采集的電壓不在0~VCC范圍,假設是±1.5V,可以通過雙電源運放轉換到0~VCC。采集到的ADC數據通過運算就 ...

https://kdocs.cn/l/srCscYPuHbqz?f=111
[文檔] GP2Y1010AU_設計參考指南及原理.pdf
https://kdocs.cn/l/sqjSGUZ0Y7jH?f=111
[文檔] SS-關于日本友穗(株)DSH02灰塵傳感器規格書-20160506.pdf
這是我拿到的模塊和夏普模塊,如果要修改濃度算法,該怎么修改,謝謝!
回復

使用道具 舉報

ID:128695 發表于 2020-11-12 23:34 | 顯示全部樓層
如果有正負電壓,一般需要通過模擬電路如運放加法器抬升到正電壓進行檢測,如果是0~1V這種小電壓為了保證精度可以通過運放放大到adc滿量程范圍,如對精度要求不高也可以只利用adc的1/5范圍進行采集
回復

使用道具 舉報

ID:549426 發表于 2020-11-12 23:42 | 顯示全部樓層
dreamtek 發表于 2020-11-12 23:34
如果有正負電壓,一般需要通過模擬電路如運放加法器抬升到正電壓進行檢測,如果是0~1V這種小電壓為了保證精 ...

我現在有個傳感器輸出是0.2-3.5v這種用你說的辦法寫程序的時候怎么寫
回復

使用道具 舉報

ID:213173 發表于 2020-11-13 06:25 | 顯示全部樓層
ybsuse 發表于 2020-11-12 23:23
現在在做一個PM2.5檢測系統,目前在網上查詢到的很多都是用夏普模塊做的,現在我手上拿到的模塊,初始無 ...

ADC采樣和顯示測量結果是兩回事。傳感器的輸出電壓范圍遠小于ADC采樣電壓范圍會明顯影響采樣精度。通常在傳感器與ADC之間加入運算放大器,以使兩者適用電壓變化范圍接近。ADC轉換結果不能直接表示實際值,需要通過換算才能得到實際值。如果傳感器的輸出電壓與樣本濃度呈正線性關系,那么按比例換算非常簡單;如果是呈非線性關系,就很難用簡單公式來計算。通常是根據傳感器制造商提供的資料制作數據表(數組),用查表法將ADC轉換結果與數據表比對,從而得到實際值用于顯示或其它用途。樓主所問上述算法公式中電壓值乘0.17再減0.1是怎么來的。0.17明顯是比值,0.1應該是修正值。
回復

使用道具 舉報

ID:549426 發表于 2020-11-13 15:24 | 顯示全部樓層
wulin 發表于 2020-11-13 06:25
ADC采樣和顯示測量結果是兩回事。傳感器的輸出電壓范圍遠小于ADC采樣電壓范圍會明顯影響采樣精度。通常在 ...

夏普模塊,前段基本是線性變化,后面拿到這個模塊,廠家文檔上面沒有具體的參考數據,能幫忙看下么?
回復

使用道具 舉報

ID:213173 發表于 2020-11-13 20:36 | 顯示全部樓層
ybsuse 發表于 2020-11-13 15:24
夏普模塊,前段基本是線性變化,后面拿到這個模塊,廠家文檔上面沒有具體的參考數據,能幫忙看下么?

根據上述兩個文件基本可以考慮使用內置10~12位ADC和EEPROM的單片機。ADC0832是8位ADC,分辨率不高。由于傳感器有效測量范圍基本呈線性變化,不必加前置運算放大器,EEPROM用于校準記錄無塵電壓,作為修正值。計算濃度也簡單得多。
回復

使用道具 舉報

ID:213173 發表于 2020-11-13 21:08 | 顯示全部樓層
ybsuse 發表于 2020-11-13 15:24
夏普模塊,前段基本是線性變化,后面拿到這個模塊,廠家文檔上面沒有具體的參考數據,能幫忙看下么?

原廠資料下載https://www.waveshare.net/wiki/Dust_Sensor
回復

使用道具 舉報

ID:549426 發表于 2020-11-14 00:49 | 顯示全部樓層
wulin 發表于 2020-11-13 20:36
根據上述兩個文件基本可以考慮使用內置10~12位ADC和EEPROM的單片機。ADC0832是8位ADC,分辨率不高。由于 ...

目前要求用ST89C52、ADC0832來做,因為實驗室現成的配件。對于精度到不是一定要求多高,本來就是練手,通過項目來學習。
回復

使用道具 舉報

ID:843349 發表于 2020-11-14 05:30 | 顯示全部樓層
加法器試一下呢?
回復

使用道具 舉報

ID:549426 發表于 2020-11-17 14:55 | 顯示全部樓層
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char //宏定義
  5. sbit RS=P1^6;//液晶接口
  6. sbit EN=P1^7;

  7. sbit LED = P2^0;//粉塵傳感器控制接口

  8. sbit ADCS = P3^7;//AD0832接口
  9. sbit ADCLK =P3^5;
  10. sbit ADDI = P3^6;
  11. sbit ADDO = P3^6;                  

  12. sbit SET= P1^1;//按鍵接口
  13. sbit ADD= P1^2;
  14. sbit DEC= P1^3;

  15. sbit BEEP=P2^1;//蜂鳴器接口

  16. uchar set_st;
  17. uchar tab[5];
  18. uint DUST_SET=150; //固體顆粒的閾值

  19. //bit shanshuo_st; //閃爍間隔標志
  20. bit beep_st; //蜂鳴器間隔標志
  21. uchar x=4; //計數器
  22. //定義標識
  23. uchar FlagStart = 0;
  24. float DUST_Value;
  25. uint DUST;
  26. uchar num=0;
  27. uchar mm;
  28. uchar abc;
  29. uchar ADC_Get[10]={0}; //定義AD采樣數組
  30. uchar str[5]={0};

  31. /*****初始化定時器0*****/
  32. void InitTimer(void)
  33. {
  34.         TMOD = 0x01;
  35.         TL0 = (65536-10000)/256; //定時10ms
  36.         TH0 = (65536-10000)%256;
  37.         TR0 = 1;
  38.         ET0 = 1;
  39.         EA = 1;
  40. }
  41. /*************************lcd1602程序**************************/
  42. void delay1ms(uint ms)//延時1毫秒
  43. {
  44.     uint i,j;
  45.         for(i=0;i<ms;i++)
  46.         for(j=0;j<100;j++);
  47. }

  48. void wr_com(uchar com)//寫指令//
  49. {
  50.     delay1ms(1);
  51.         RS=0;
  52. //        RW=0;
  53.         EN=0;
  54.         P0=com;
  55.         delay1ms(1);
  56.         EN=1;
  57.         delay1ms(1);
  58.         EN=0;
  59. }
  60. void wr_dat(uchar dat)//寫數據//
  61. {
  62.     delay1ms(1);;
  63.         RS=1;
  64. //        RW=0;
  65.         EN=0;
  66.         P0=dat;
  67.         delay1ms(1);
  68.         EN=1;
  69.         delay1ms(1);
  70.         EN=0;
  71. }
  72. /*****************************液晶初始化
  73. *********************************************/
  74. void lcd_init()//初始化設置//
  75. {
  76.         delay1ms(15);
  77.         wr_com(0x38);
  78.         delay1ms(5);
  79.         wr_com(0x01);
  80.         delay1ms(5);
  81.         wr_com(0x06);
  82.         delay1ms(5);
  83.         wr_com(0x0c);
  84.         delay1ms(5);

  85.         wr_com(0x80);
  86.         wr_dat('P');//
  87.         wr_com(0x81);
  88.         wr_dat('M');//:
  89.         wr_com(0x82);
  90.         wr_dat('2');//
  91.         wr_com(0x83);
  92.         wr_dat('.');//:
  93.         wr_com(0x84);
  94.         wr_dat('5');//:
  95.         wr_com(0x85);
  96.         wr_dat(':');


  97.         wr_com(0x8b);
  98.         wr_dat('m');
  99.         wr_com(0x8c);
  100.         wr_dat('g');
  101.         wr_com(0x8d);
  102.         wr_dat('/');
  103.         wr_com(0x8e);
  104.         wr_dat('m');
  105.         wr_com(0x8f);
  106.         wr_dat('3');
  107.         


  108. /////////////////////////////////////

  109.         wr_com(0xc0);
  110.         wr_dat('A');
  111.         wr_com(0xc1);
  112.         wr_dat('l');
  113.         wr_com(0xc2);
  114.         wr_dat('a');
  115.         wr_com(0xc3);
  116.         wr_dat('r');
  117.         wr_com(0xc4);
  118.         wr_dat('m');
  119.         wr_com(0xc5);
  120.         wr_dat(':');

  121.         wr_com(0xcb);
  122.         wr_dat('m');
  123.         wr_com(0xcc);
  124.         wr_dat('g');
  125.         wr_com(0xcd);
  126.         wr_dat('/');
  127.         wr_com(0xce);
  128.         wr_dat('m');
  129.         wr_com(0xcf);
  130.         wr_dat('3');
  131. }
  132. /*****************顯示函數******************************/
  133. void disp(unsigned int Data)//PM2.5值顯示
  134. {
  135.         uint Temp;
  136.         Temp=Data%10000;
  137.         str[0]=Temp/1000+0x30; //千位
  138.         Temp%=1000;
  139.         str[1]='.';
  140.         str[2]=Temp/100+0x30; //百位
  141.         Temp%=100;
  142.         str[3]=Temp/10+0x30; //十位
  143.         str[4]=Temp%10+0x30; //個位
  144.         wr_com(0x86);
  145.         wr_dat(str[0]);
  146.         wr_com(0x87);
  147.         wr_dat(str[1]);
  148.         wr_com(0x88);
  149.         wr_dat(str[2]);
  150.         wr_com(0x89);
  151.         wr_dat(str[3]);
  152.         wr_com(0x8a);
  153.         wr_dat(str[4]);

  154. }
  155. /************************報警值顯示************************************/
  156. void baojing()
  157. {
  158.         wr_com(0xc6);
  159.         wr_dat(tab[0]+0x30);
  160.         wr_com(0xc7);
  161.         wr_dat(tab[1]);
  162.         wr_com(0xc8);
  163.         wr_dat(tab[2]+0x30);
  164.         wr_com(0xc9);
  165.         wr_dat(tab[3]+0x30);
  166.         wr_com(0xca);
  167.         wr_dat(tab[4]+0x30);
  168. }
  169. /*****延時子程序*****/
  170. void Delay(uint num)
  171. {
  172. while( --num );
  173. }
  174. /**************************按鍵檢測
  175. *******************************************/
  176. void checkkey()
  177. {
  178.         if(SET==0)
  179.         {
  180.         Delay(2000);
  181.         do{}while(SET==0);
  182.         set_st++;
  183.         if(set_st>1)set_st=0;
  184.         }
  185.         if(set_st==0)
  186.         {
  187.         }
  188.         else if(set_st==1)
  189.         {
  190.         if(DEC==0)
  191.         {
  192.         Delay(2000);
  193.         do{}while(DEC==0);
  194.         if(DUST_SET>0)DUST_SET--;
  195.         if(DUST_SET==0)DUST_SET=0;
  196.         }
  197.         if(ADD==0)
  198.         {
  199.         Delay(2000);
  200.         do{}while(ADD==0);
  201.         DUST_SET++;
  202.         if(DUST_SET>800)DUST_SET=800;
  203.         }
  204.         }
  205.         tab[0]=DUST_SET/1000;
  206.         tab[1]='.';
  207.         tab[2]=DUST_SET%1000/100;
  208.         tab[3]=DUST_SET%100/10;
  209.         tab[4]=DUST_SET%10;
  210. }
  211. /*****報警子程序*****/
  212. void Alarm()
  213. {
  214.         if(x>=10){beep_st=~beep_st;x=0;}
  215.         if(DUST>DUST_SET&&beep_st==1)BEEP=0;
  216.         else BEEP=1;
  217. //        if(DUST>0&&DUST<100){LED2=0;LED3=1;LED4=1;}
  218. //        if(DUST>=10&&DUST<300){LED2=1;LED3=0;LED4=1;}
  219. //        if(DUST>=300){LED2=1;LED3=1;LED4=0;}
  220.         }
  221. /**************************AD0832轉換程序
  222. ***********************************************/
  223. uchar ADC0832(bit mode,bit channel) //AD轉換,返回結果
  224. {
  225.         uchar i,dat,ndat;
  226.         ADCS = 0;//拉低CS端
  227.         _nop_();
  228.         _nop_();
  229.         ADDI = 1; //第1個下降沿為高電平
  230.         ADCLK = 1;//拉高CLK端
  231.         _nop_();
  232.         _nop_();
  233.         ADCLK = 0;//拉低CLK端,形成下降沿1
  234.         _nop_();
  235.         _nop_();
  236.         ADDI = mode; //低電平為差分模式,高電平為單通道模式。
  237.         ADCLK = 1;//拉高CLK端
  238.         _nop_();
  239.         _nop_();
  240.         ADCLK = 0;//拉低CLK端,形成下降沿2
  241.         _nop_();
  242.         _nop_();
  243.         ADDI = channel; //低電平為CH0,高電平為CH1
  244.         ADCLK = 1;//拉高CLK端
  245.         _nop_();
  246.         _nop_();
  247.         ADCLK = 0;//拉低CLK端,形成下降沿3
  248.         ADDI = 1;//控制命令結束(經試驗必需)
  249.         dat = 0;
  250.         //下面開始讀取轉換后的數據,從最高位開始依次輸出(D7~D0)
  251.         for(i = 0;i < 8;i++)
  252.         {
  253.         dat <<= 1;
  254.         ADCLK=1;//拉高時鐘端
  255.         _nop_();
  256.         _nop_();
  257.         ADCLK=0;//拉低時鐘端形成一次時鐘脈沖
  258.         _nop_();
  259.         _nop_();
  260.         dat |= ADDO;
  261.         }
  262.         ndat = 0; //記錄D0
  263.         if(ADDO == 1)
  264.         ndat |= 0x80;
  265.         //下面開始繼續讀取反序的數據(從D1到D7)
  266.         for(i = 0;i < 7;i++)
  267.         {
  268.         ndat >>= 1;
  269.         ADCLK = 1;//拉高時鐘端
  270.         _nop_();
  271.         _nop_();
  272.         ADCLK=0;//拉低時鐘端形成一次時鐘脈沖
  273.         _nop_();
  274.         _nop_();
  275.         if(ADDO==1)
  276.         ndat |= 0x80;
  277.         }
  278.         ADCS=1;//拉高CS端,結束轉換
  279.         ADCLK=0;//拉低CLK端
  280.         ADDI=1;//拉高數據端,回到初始狀態
  281.         if(dat==ndat)
  282.         return(dat);
  283.         else
  284.         return 0;
  285. }
  286. /*****定時器0中斷服務程序*****/
  287. void timer0(void) interrupt 1
  288. {
  289.         uint j;
  290.         TL0 = (65536-10000)/256; //定時10ms
  291.         TH0 = (65536-10000)%256;
  292.         LED=1; //開啟傳感器的LED
  293.         x++;
  294.         for (j=0;j<30;j++); //0.28ms //延時0.28ms
  295.         abc=ADC0832(1,0); //開啟ADC采集
  296.         FlagStart=1;
  297.         TR0 = 0; //先關閉定時器0
  298.         EA = 0;
  299.         LED=0;//關閉傳感器LED
  300. }
  301. //中值濾波
  302. //算法:先進行排序,然后將數組的中間值作為當前值返回。
  303. uchar Error_Correct(uchar *str,uchar num)
  304. {
  305.         unsigned char i=0;
  306.         unsigned char j=0;
  307.         unsigned char Temp=0;
  308.         //排序
  309.         for(i=0;i<num-1;i++)
  310.         {
  311.         for(j=i+1;j<num;j++)
  312.         {
  313.            if(str[i]<str[j])
  314.                 {
  315.                 Temp=str[i];
  316.                 str[i]=str[j];
  317.                 str[j]=Temp;
  318.                 }
  319.         }
  320. }

  321.         //去除誤差,取中間值
  322.         return str[num/2];
  323. }
  324. /*****主函數*****/
  325. void main(void)
  326. {
  327.         InitTimer(); //初始化定時器
  328.         BEEP=1;
  329.         lcd_init();//初始化顯示
  330.         delay1ms(500);
  331.         while(1)
  332.         {

  333.          checkkey();//按鍵檢測
  334.         if(set_st==0)
  335.         {
  336.                 //wr_com(0x0c);
  337.                 if(FlagStart==1) //1次數據采集完成
  338.                 {
  339.                 num++;
  340.                 ADC_Get[num]=abc;
  341.                 if(num>9)
  342.                 {
  343.                 num=0;
  344. //                DUST=Error_Correct(ADC_Get,10); //求取10次AD采樣的值
  345. //                DUST_Value=(DUST/256.0)*5000; //轉化成電壓值MV
  346. //                DUST_Value=DUST_Value*0.17-100; //固體懸浮顆粒濃度計算 Y=0.17*X-0.1 X--采樣電壓V
  347.         
  348.                 DUST=Error_Correct(ADC_Get,10);
  349.             DUST_Value=(DUST/256.0)*5;//轉化成電壓值
  350.             DUST_Value=(DUST_Value*0.17-0.1)*1000;//固體懸浮顆粒濃度計
  351.         
  352.                 if(DUST_Value<0) DUST_Value=0;
  353.                 if(DUST_Value>760) DUST_Value=760; //限位
  354.                 DUST=(uint)DUST_Value;
  355.                 }
  356.                 TL0 = (65536-10000)/256;
  357.                 TH0 = (65536-10000)%256;
  358.                 TR0 = 1; //開啟定時器0
  359.                 EA = 1;
  360.                 FlagStart=0;
  361.                 }
  362.                 Alarm(); //報警檢測
  363.         }
  364.         disp(DUST);//顯示粉塵濃度值
  365.         baojing();//顯示報警值

  366.                 if(set_st==1)//報警值閃動
  367.                 {
  368.                 wr_com(0xca);
  369.                 wr_com(0x0d);
  370.                 delay1ms(150);
  371.                 }
  372.         }
  373. }
復制代碼

這是別人做好的夏普的程序,其中關于ADC采集回來的結果轉換為灰塵濃度,不明白她的公式怎么來的,難道是按照給的那個圖像,算出直線的方程,但是我我試了下也不是。
回復

使用道具 舉報

ID:213173 發表于 2020-11-20 10:53 | 顯示全部樓層
ybsuse 發表于 2020-11-17 14:55
這是別人做好的夏普的程序,其中關于ADC采集回來的結果轉換為灰塵濃度,不明白她的公式怎么來的,難道 ...

P2.5.zip (112.16 KB, 下載次數: 7)
回復

使用道具 舉報

ID:549426 發表于 2020-11-23 17:36 | 顯示全部樓層
回復

使用道具 舉報

ID:213173 發表于 2020-11-26 07:32 | 顯示全部樓層

無標題.jpg

Dust Sensor 灰塵傳感器 用戶手冊.pdf (659.61 KB, 下載次數: 4)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产一区二区在线 | 久久国产精品免费一区二区三区 | 欧美精品99| 98成人网 | 亚洲精品一区二区在线观看 | 天天干天天爽 | 国产黄色大片 | 精品一区二区三区四区五区 | 免费三级网站 | 欧美成人一区二区三区 | 免费亚洲一区二区 | 亚洲一区二区精品视频 | 久久久久国产一区二区三区 | 99精品国产一区二区三区 | 国产一级免费在线观看 | 亚洲日本一区二区 | 一区二区视频在线 | 色婷婷综合久久久久中文一区二区 | 国产欧美一区二区三区日本久久久 | www.国产一区 | 超碰97免费在线 | 亚洲精品黄色 | 91成人免费观看 | 人人鲁人人莫人人爱精品 | 日韩一区二区三区在线播放 | 在线欧美视频 | 成人在线免费观看 | 久草青青草 | 国产亚洲精品久久久久久牛牛 | 欧美在线观看一区 | 日韩高清国产一区在线 | 日韩中文字幕一区 | 欧美一区二区三区在线播放 | 免费精品久久久久久中文字幕 | 亚州精品天堂中文字幕 | 国产视频一区在线 | 久久最新精品视频 | 不卡一区 | 中文字幕一区在线 | 亚洲欧美综合精品另类天天更新 | 色综合天天综合网国产成人网 |