導航:首頁 > 操作系統 > pic單片機ad程序

pic單片機ad程序

發布時間:2022-08-04 15:12:37

Ⅰ PIC單片機AD中斷什麼時候開啟

AD模數轉換,是把模擬電壓數值采樣進來,然後轉換成數字信號。這一采樣和轉換是需要時間的。並不是一開AD就能讀到數字信號數據。
一般來說其時間都只有幾微秒到幾百微秒(根據設置不同而定)。如果單片機沒有其他工作的時候,可以用循環等待的方式等AD轉換結束(轉換結束後DONE位會被置位)。但如果你的單片機還有其他工作,那就沒必要在等待它上面花費時間。可以開AD操作後,繼續執行其他程序。而轉換結束後,AD中斷可以暫時斷開現有炒作,而把AD數據讀進來。這就是AD中斷的作用。

Ⅱ PIC外部中斷,AD轉換程序中斷問題。

工欲善其事必先利其器。初始化子程序adinitial()是用於做准備的,設置一下AD模塊,打開這個AD,設置輸入的方式和采樣轉換時間什麼的。所以這叫「初始化」。
而中斷服務程序就是實際執行AD採集的任務的。
有AD中斷發生,單片機自動標志AD標志位,然後觸發中斷服務程序。

Ⅲ PIC單片機AD轉換演算法問題,看得不是很明白

大概看了一下,基本上就是連續AD采樣10次,將累加和進行分區間的處理。最後加上邊界保護。

這程序的邏輯十分混亂,編程的人屬於想到哪裡寫到哪裡的狀態,即使作為作業也是不合格的。

Ⅳ pic單片機多路ad轉換

我恰好做過一個PIC 4通道A/D,您先看看我的程序 有問題留言

#include <pic.h> //調用頭文件,可以去PICC軟體下去查找PIC16F873A單片機的頭文件
#include <stdio.h> //調用頭文件
#include <math.h> //調用頭文件
__CONFIG(XT&PROTECT&WDTEN&PWRTEN); //定義配置字,晶振類型:XT,打開開門狗,代碼保護
unsigned char count,count1,tunnel,t1s; //0.1s計時,1s計時,通道號,1s時間到標志
unsigned int result[4],s[4]; //轉換電壓結果、轉換時間結果
unsigned char f[4]; //輸入埠狀態存儲表
union{
struct{
unsigned b0:1; //通道1有輸入標志
unsigned b1:1; //通道2有輸入標志
unsigned b2:1; //通道3有輸入標志
unsigned b3:1; //通道4有輸入標志
unsigned b4:1; //通道1需要AD采樣標志
unsigned b5:1; //通道2需要AD采樣標志
unsigned b6:1; //通道3需要AD采樣標志
unsigned b7:1; //通道4需要AD采樣標志
}one;
unsigned char allbits;
}myflag; //共佔一個位元組的數據寄存器存儲空間的標志位
#define b0 myflag.one.b0 //定義標志b0
#define b1 myflag.one.b1 //定義標志b1
#define b2 myflag.one.b2 //定義標志b2
#define b3 myflag.one.b3 //定義標志b3
#define b4 myflag.one.b4 //定義標志b4
#define b5 myflag.one.b5 //定義標志b5
#define b6 myflag.one.b6 //定義標志b6
#define b7 myflag.one.b7 //定義標志b7
#define in1 RB4 //定義1通道輸入口為RB4埠
#define in2 RB5 //定義2通道輸入口為RB5埠
#define in3 RB6 //定義3通道輸入口為RB6埠
#define in4 RB7 //定義4通道輸入口為RB7埠
#define out1 RC0 //定義1通道輸出口為RC0埠
#define out2 RC1 //定義2通道輸出口為RC1埠
#define out3 RC2 //定義3通道輸出口為RC2埠
#define out4 RC3 //定義4通道輸出口為RC3埠
//---------------------------------------
//名稱: 定時器T0中斷初始化函數
//-----------------------------------------
void T0init(void)
{
T0CS=0; //T0工作在定時器方式
PSA=0; //分頻器給TMR0
PS0=1; //1:16分頻
PS1=1;
PS2=0;
T0IF=0; //清零T0中斷標志
T0IE=1; //清除T0中斷使能
}
//---------------------------------------
//名稱:RB口引腳電平變化中斷初始化函數
//-----------------------------------------
void RBinit(void)
{
RBPU=1; //內部弱上拉禁止
RBIF=0; //中斷標志清零
RBIE=1; //中斷使能
PORTB=PORTB; //鎖存舊值,為下次變化做准備
}
//---------------------------------------
//名稱:RA口引腳A/D初始化函數
//-----------------------------------------
void ADinit(void)
{
ADCON1=0x00; //設置RA口所有為模擬輸入,採取左對齊方式存放結果
ADCON0=0b11000001; //AD采樣時鍾為內部RC,默認第一次通道為RA0,啟用轉換模塊
ADIE=0; //關閉中斷使能禁止
}
//---------------------------------------
//名稱: 主初始化函數
//-----------------------------------------
void init(void)
{
unsigned char i;
TRISA=0b00101111; //初始化AN0-AN5為輸入
TRISC=0x00; //初始化C口為輸出
TRISB=0xFF; //初始化RB0-RB7為輸入
PORTC=0b00000000; //初始化輸出
count=0; //初始化T0計數器
count1=0; //初始化T0計數器
tunnel=1; //初始化通道號為1
myflag.allbits=0x00; //初始化標志位
for(i=0;i<4;i++) //初始化延時量和輸入埠狀態
{s[i]=30;
f[i]=0;}
}
//---------------------------------------
//-----------------------------------------
//名稱: 中斷服務子函數
//-----------------------------------------
void interrupt ISR(void)
{
//全局中斷屏蔽
if(RBIF&&RBIE) //RB邊沿中斷類型判別
{
PORTB=PORTB;
RBIF=0;
if(in1) //判斷1通道狀態
b0=1;
else
b0=0;
if(in2) //判斷2通道狀態
b1=1;
else
b1=0;
if(in3) //判斷3通道狀態
b2=1;
else
b2=0;
if(in4) //判斷4通道狀態
b3=1;
else
b3=0;
} //RB_int服務子程序1

if(T0IF&&T0IE) //定時器T0中斷類型判別
{
TMR0=TMR0+8; //發生一次的時間為250*16=4ms
T0IF=0;
count+=1;
if(count==25) //計數基數25*16*250=0.1s
{
count=0;
count1+=1;
if(count1==5) //計數基數0.1s*5=0.5s
{
count1=0;
t1s=1; //1s時間到標志
}
}
} //Tmr0_int服務子程序3
//全局中斷使能
}
//-----------------------------------------
//名稱:delay延時
//-----------------------------------------
void delay()
{
unsigned int i;
for(i=0;i<10;i++);//采樣延時160us
}
//-----------------------------------------
//-----------------------------------------
//名稱:A/D轉換選擇子程序
//-----------------------------------------
void ADconvert(void)
{
switch(tunnel) //AD通道選擇
{
case 1: //1通道AD采樣轉換
ADCON0=0b11000001; //設置1通道
delay(); //采樣延時
#asm
clrf _STATUS ;
bsf _ADCON0,2 ;
btfsc _ADCON0,2 ;
goto $-1 ;
#endasm //結束采樣
result[0]=ADRESH; //把結果保存
s[0]=result[0]*120>>8; //把結果轉化為時間
if(s[0]<2) //限制最小值1s
s[0]=2;
else if(s[0]>120)
s[0]=120; //限制最大值60s
break; //跳出
case(2): //2通道AD采樣轉換
ADCON0=0b11001001; //設置2通道
delay(); //采樣延時
#asm
clrf _STATUS ;
bsf _ADCON0,2 ;
btfsc _ADCON0,2 ;
goto $-1 ;
#endasm //結束采樣
{result[1]=ADRESH;} //把結果保存
s[1]=result[1]*120>>8; //把結果轉化為時間
if(s[1]<2) //限制最小值1s
s[1]=2;
else if(s[1]>120)
s[1]=120; //限制最大值60s
break; //跳出
case(3): //3通道AD采樣轉換
ADCON0=0b11010001; //設置3通道
delay();
#asm
clrf _STATUS ;
bsf _ADCON0,2 ;
btfsc _ADCON0,2 ;
goto $-1 ;
#endasm //結束采樣
{result[2]=ADRESH;} //把結果保存
s[2]=result[2]*120>>8; //把結果轉化為時間
if(s[2]<2) //限制最小值1s
s[2]=2;
else if(s[2]>120)
s[2]=120; //限制最大值60s
break; //跳出
case(4): //4通道AD采樣轉換
ADCON0=0b11011001; //設置4通道
delay(); //采樣延時
#asm
clrf _STATUS ;
bsf _ADCON0,2 ;
btfsc _ADCON0,2 ;
goto $-1 ;
#endasm //結束采樣
{result[3]=ADRESH;} //把結果保存
s[3]=result[3]*120>>8; //把結果轉化為時間
if(s[3]<2) //限制最小值1s
s[3]=2;
else if(s[3]>120)
s[3]=120; //限制最大值60s
break; //跳出
default:break; //出錯跳出
}
}
//---------------------------------------
//名稱:deal通道處理
//-----------------------------------------
void deal(void)
{
unsigned char i;
if(t1s) //判斷0.5秒時間是否到
{
asm("nop");
t1s=0; //0.5秒時間標志清零,等待下0.5秒
if(b0) //是第1通道嗎
{
if(b4) //是第1通道有變化後的采樣嗎
{tunnel=1; //賦值AD通道號
ADconvert(); //開始AD轉換
b4=0;} //沒變化不再采樣
if(!(s[0]--)) //延時計時開始
out1=1;} //繼電器開始動作
else out1=0;
if(b1) //是第2通道嗎
{
if(b5) //是第2通道有變化後的采樣嗎
{tunnel=2; //賦值AD通道號
ADconvert(); //開始AD轉換
b5=0;} //沒變化不再采樣
if(!(s[1]--)) //延時計時開始
out2=1;} //繼電器開始動作
else out2=0;
asm("clrwdt");
if(b2) //是第3通道嗎
{
if(b6) //是第3通道有變化後的采樣嗎
{tunnel=3; //賦值AD通道號
ADconvert(); //開始AD轉換
b6=0;} //沒變化不再采樣
if(!(s[2]--)) //延時計時開始
out3=1;} //繼電器開始動作
else out3=0;
if(b3) //是第4通道嗎
{
if(b7) //是第4通道有變化後的采樣嗎
{tunnel=4; //賦值AD通道號
ADconvert(); //開始AD轉換
b7=0;} //沒變化不再采樣
if(!(s[3]--)) //延時計時開始
out4=1;} //繼電器開始動作
else out4=0;
}
asm("nop"); //1秒時間沒到繼續檢測
}
//-----------------------------------------
//名稱:主函數
//-----------------------------------------
void main()
{
init(); //全局初始化
T0init(); //T0初始化
ADinit(); //A/D初始化
RBinit(); //RB初始化
asm("nop"); //穩定狀態
asm("nop");
delay();
delay(); //耗時0.7ms
//-----------------------------------------
{ //開機初始化采樣AD
tunnel=1;
ADconvert();
tunnel=2;
ADconvert();
tunnel=3;
ADconvert();
tunnel=4;
ADconvert();
} //開機1次AD,到此耗時2.4ms,這個時間前不要有觸發
if(in1) //開機一次狀態判斷
{b0=1;
f[0]=in1;} //存儲開機時1通道狀態
if(in2)
{b1=1;
f[1]=in2;} //存儲開機時2通道狀態
if(in3)
{b2=1;
f[2]=in3;} //存儲開機時3通道狀態
if(in4)
{ b3=1;
f[3]=in4;} //存儲開機時4通道狀態
//-----------------------------------------
ei(); //打開全局中斷
//-----------------------------------------
while(1) //主循環
{
asm("clrwdt"); //清看門狗
if(b0) //判斷1通道狀態
{
if(f[0]!=in1)
{f[0]=in1; //存儲1通道狀態
b4=1;} //1通道是否進行AD標志
} //設定1通道有效標志
else
{
b4=0;
f[0]=in1;} //設定1通道無效標志
if(b1) //判斷2通道狀態
{
if(f[1]!=in2)
{f[1]=in2; //存儲2通道狀態
b5=1;} //2通道是否進行AD標志
} //設定2通道有效標志
else
{
b5=0;
f[1]=in2;} //設定2通道無效標志
if(b2) //判斷3通道狀態
{
if(f[2]!=in3)
{f[2]=in3; //存儲3通道狀態
b6=1;} //3通道是否進行AD標志
} //設定3通道有效標志
else
{
b6=0;
f[2]=in3;} //設定3通道無效標志
if(b3) //判斷4通道狀態
{
if(f[3]!=in4)
{f[3]=in4; //存儲4通道狀態
b7=1;} //4通道是否進行AD標志
} //設定4通道有效標志
else
{
b7=0;
f[3]=in4;} //設定4通道無效標志
deal(); //最大循環時間不超過4ms,看門狗典型值18ms
asm("nop"); //中斷檢測
}
}
//---------------------------------------

Ⅳ PIC單片機的AD采樣問題

PIC24的單片機有多個AD輸入通道(即多個輸入引腳)。當你想在一次AD中斷只讀取一個通道的AD值時候,就不需要掃描輸入。如果想一次中斷採集到多個AD引腳的電壓值,就要設置掃描輸入。
這個掃描輸入就是一次性把多路AD掃描進來的意思。明白否~

Ⅵ 如何用程序實現PIC單片機AD轉換器的8路信號輪流採集

PIC單片機在某一時間段內只能採集開啟一個AD轉換通道來進行採集,你可以通過模擬通道選擇位來進行通道選擇的先後順序/.
可以定義一個數組用來存放採集數據
先使能AD采樣,進中斷.清標志位,配置通道(如AN0),把采樣結果存入數組.
輪流進行
採集時間一結束,即可啟動 A/D 轉
換。 可將採集時間編程設定在 GO/DONE位置1和實際
轉換啟動之間。
可參考pic.的PDF資料

Ⅶ pic單片機ADC不準確

可以試著在硬體上加一個濾波電容,然後軟體上可以連續採集6次,去掉最大和最小,然後取平均值。
pic24的單片機有多個ad輸入通道(即多個輸入引腳)。當你想在一次ad中斷只讀取一個通道的ad值時候,就不需要掃描輸入。如果想一次中斷採集到多個ad引腳的電壓值,就要設置掃描輸入。
PIC單片機(PeripheralInterfaceController)是一種用來開發的去控制外圍設備的集成電路(IC)。一種具有分散作用(多任務)功能的CPU。PIC單片機有計算功能和記憶內存像CPU並由軟體控制運行。

Ⅷ 關於PIC單片機AD采樣的問題

PIC24的單片機有多個AD輸入通道(即多個輸入引腳)。當你想在一次AD中斷只讀取一個通道的AD值時候,就不需要掃描輸入。如果想一次中斷採集到多個AD引腳的電壓值,就要設置掃描輸入。
這個掃描輸入就是一次性把多路AD掃描進來的意思。

閱讀全文

與pic單片機ad程序相關的資料

熱點內容
程序員送女友的相冊 瀏覽:251
壓縮文件怎麼設置打開加密 瀏覽:764
tracert命令結果詳解 瀏覽:356
唯賽思通用什麼APP 瀏覽:371
古玩哪個app好賣 瀏覽:146
u盤內容全部顯示為壓縮包 瀏覽:517
編譯固件時使用00優化 瀏覽:357
速借白條app怎麼樣 瀏覽:756
用紙張做的解壓東西教程 瀏覽:12
求圓的周長最快演算法 瀏覽:190
安卓熱點怎麼減少流量 瀏覽:270
北京代交社保用什麼app 瀏覽:855
第一眼解壓視頻 瀏覽:726
文件夾err是什麼 瀏覽:97
qt4編程pdf 瀏覽:572
區域網伺服器下如何連續看照片 瀏覽:254
經過加密的數字摘要 瀏覽:646
加密鎖9000變列印機 瀏覽:694
程序員的職業發展前途 瀏覽:639
安卓是世界上多少個程序員開發 瀏覽:45