国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

單片機查表程序的自動生成技術

發布時間:2010-8-1 23:43    發布者:conniede
單片機應用系統中,常用到許多復雜的數學計算,如計算sin(x)、cos(x)、有效值計算、非線性插值等。這些在高級語言中是簡單的工作,而在單片機的匯編語言中卻是非常復雜的。因為,這些運算大都要用乘除運算來進行近似運算,計算的精度很難滿足要求。更難以接受的是其運算時間太長,這對于無乘除指令的單片機系統更是如此。采用查表取代復雜的計算是一個明智的選擇。但是,這種查表程序表格往往都較長,通常為幾十條到一二百條,如果采用手工輸入不但要花費大量的時間,而且還容易出錯。利用高級語言的單片機查表程序的自動生成技術可以大大減小工作量,而且不易出錯。
  
用過Microchip公司的PIC16系列單片機的讀者都知道,該系列單片機具有許多優點,唯感遺憾的是在該指令中沒有乘除指令(PIC17以系列才有乘指令)。在應用中常要自編乘除了程序以完成乘除運算,這種程序執行都要花費較多的時間,如雙字節的乘法,運算一次需要花費100多個指令周期,而如果要用乘除進行sin(x)、cos(x)、開方的計算,則花費的時間就更多。因此,利用高級語言進行單片機查表程序的自動笥成技術在PIC16系列單片機中就顯得更有意義。
  
現以目前在我國正大量使用的Microchip公司的PIC16系列單片機為例,用幾個例子說明該技術的應用。當然,這種方法也可以用在其它單片機中,只是所給的示例程序中有關單片機的語句要改為相應的單片機語言。本文采用TubroC作為高級語言的編程工具,也可以采用其它高級語言。

1 原理

利用高級語言自動生成查表程序的實質就是利用高級語言的計算功能,把原本復雜的計算轉換為簡單的查表結果,以文本文件的形式輸出查表程序,在單片機編程中將該段程序插入相應的程序中去。在應用中需要注意的是:查表結果沒有小數,故在計算輸出時要四舍五入;查表結果只能在0~255之間,超出此范圍要加以處理。PIC16系列單片機的匯編程序默認數制為十六進制,如要使用十進制,要在數前加“.”。還有一點要注意的是,在插入查表程序時特別要注意查表程序不能跨過0~255的頁面。

2 示例

2.1 用D/A輸出復雜的波形

用D/A器件可以輸出復雜的波形,如sin(x)、雙音多頻信號等復雜的波形。這里以并行D/A、輸出sin(x)為例,假設電源電壓為5V,D/A的參考電壓也為5V;同時假設在sin(x)的半波中共輸出90個點(2°輸出1個點),相應的C語言源程序如下:

/*程序A.C*/
#include
#include
main()
{
FILE *fp;
char f[15];
float Vmax,v,w;
int i,k;
puts ("the output file name:");
gets (f); /*輸入要輸出的文件名*/
if((fp=fopen(f,"w"))= =NULL)
{puts("con't open output file");
exit(0);
}
puts("Vmax:");
scanf("%f",&Vmax); /*輸入要輸出的sin波形峰值*/
fprintf(fp,"SUB1 MOVWF BUF"); /*輸出查表程序的第1行*/
fprintf(fp,"SUBLW .%d",90); /*輸出查表程序的第2行*/
fprintf(fp,"BTFSS STATUS,C");/*輸出查表程序的第3行*/
fprintf(fp,"RETLW .0"); /*輸出查表程序的第4行*/
fprintf(fp,"MOVLW HIGH($+4)"); /*輸出查表程序的第5行*/
fprintf(fp,"MOVWF PCLATH"); /*輸出查表程序的第6行*/
fprintf(fp,"MOVF BUF,W"); /*輸出查表程序的第7行*/
fprintf(fp,"ADDWF PCL,F"); /*輸出查表程序的第8行*/
for(i=0;i<=90;i++)
{w=i*2; /*2°輸出1個點*/
w=w*3.14159/180; /*轉換成弧度*/
v=sin(w)*255*Vmax*5; /*根據電壓峰值計算該點的輸出值*/
k=v+0.5; /*四舍五入*/
if(k<0)k=0;
if(k>255)k=255;
fprinft(fp,"RETLW.%d;%.d",k,i); /*輸出查表表格*/
}
fclose(fp);
printf("Press any key to end
……");
getch();
}

利用以上程序,計算時輸入文件名為A.ASM,Vmax=3,得至的A.ASM的內容如下(共90行表格,略去其中的大部分表格):

;A.ASM
SUB1 MOVWF BUF
SUBLW .90
BTFSS STATUS,C
RETLW .0
MOVLW HIGH($+4)
MOVWF PCLATH
MOVF BUF,W
ADDWF PCL,F
RETLW .0;0
RETLW .5;1
……
RETLW .90;72
RETLW .86;73
RETLW .81;74
……
RETLW .11;88
RETLW .5;89
RETLW .0;90
  
把以下程序插入單片機程序的適當地方,查表時中要賦以W相應的值,再CALLSUB1就可以得到sin(x)第W點上的值。整個計算約10個指令周期(如采用4MHz晶振,為10μs左右)。如果采用乘除的方法計算,至少要花幾百甚至上千個指令周期,而且得到的結果精度也差。

2.2 非線性插值

在單片機應用中會遇到非線性元件,例如熱敏電阻的電阻-溫度特性、斷路器的保護特性等都是非線性關系。這里以斷路器的保護特性為例,說明自動編程的應用。假設現在要仿真的斷路器的特性為雙曲線,如圖1所示。

據此,可以設延時時間與電流的關系為

(I+I0)(t+t0)=K
(1)

由圖1的三個點可以得到以下聯立方程組:

(I+20)(t+33)=K
(I+40)(t+20)=K (2)
(I+90)(t+10)=K

采用迭代法解得I0=11.111 1,t0=0.222
2,K=1 033.58,代入式(1)得
t=[1 033.58/(I+11.111 1)]-0.222
2 (3)

現在假設在硬件線路中,電流信號是轉換為電壓信號經A/D后得到的,其相應點的關系為:0A→0V,100A→3V,A/D為8位,A/D參考電壓為5V。轉換計算首先將A/D值轉換為對應的電壓值,再將電壓值轉換為對應的電流值I,再根據式(3)求相應的延時時間T,最后將延時時間T再轉換為延時的間常數T0。T0按式(4)計算:

(256-t0)·Tcy·K=T
(4)
t0=256-t/(Tcy·K) (5)

其中,Tcy為指令周期,在4MHz晶振時,Tcy=1μs;K為預分頻系數;t為欲延時的時間,單位為μs。
假設定時器用TMR0,預分頻系數為256,晶振的振蕩頻率為4MHz,則最大延時為65.535ms。程序如下(其中與程序A.C相同或類似的均略去):

/*程序B.C*/
……
fprintf(fp,"SUB2 MOVWF BUF");
fprintf(fp,"MOVLW HIGH($+4)");
fprintf(fp,"MOVWF PCLATH");
fprintf(fp,"MOVF BUF,W");
fprintf(fp,"ORG 200H,F"); /*表格從200H開始,避免跨頁*/
fprintf(fp,"ADDWF PLC,F");
for(i=0;i<=254;i++)
{ad=i;
v=ad*5/255; /*求相應于A/D值的電壓V*/
I=100*v/3; /*求相應的電流I*/
T=1033.58/(I+11.1111)-0.2222; /*按式(3)求相應的延時時間*/
T0=256-T*1000*256; /*轉換為時間常數*/
k=T0+0.5;
if(k<0)k=0;
if(k>255)k=255;
fprintf(fp,)"
RETLW.%d;AD=.%d,I=%5.1f(A),T=%5.1f(ms)",k,i,I,T);
}
……

形成的查表程序如下(共255行表格,略去其中的大部分表格):

;B.asm
SUB2 MOVWF BUF
MOVLW HIGH($+4)
MOVWF PCLATH
MOVF BUF,W
ORG 200H
ADDWF PCL,F
RETLW .0;AD=.0,I=0.0(A),T=92.8(ms)
……
RETLW .116;AD=.27,I=17.6(A),T=35.7(ms)
RETLW .120;AD=.28,I=18.3(A),T=34.9(ms)
RETLW .123;AD=.29,I=19.0(A),T=34.2(ms)
RETLW .125;AD=.30,I=19.6(A),T=33.4(ms)
……
RETLW .234;AD=.254,I=166.0(A),T=5.6(ms)

單片機進行電流采樣A/D,把A/D結果賦給W,CALL SUB2便可得到相應的延時時間常數W。

3 結論

利用高級語言自動生成單片機的查表程序,可以完成許多單片機難以完成或需要進行大量計算才能完成的復雜運算,計算精度高。單片機利用此結果進行插值運行速度要快得多。典型的4MHz晶振時,需要的運算時間為10μs。限于篇幅,本文只給出兩個實例,實際上它可以用于單片機測控系統中的許多方面,如模糊控制中的模糊規則的推理、非線性傳感器的特性讀取以及其它方面。 [/table]
本文地址:http://m.qingdxww.cn/thread-18346-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區

相關在線工具

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日本日韩aⅴ在线视频 欧美日本日韩 | 国产情侣真实露脸在线最新 | 免费色网 | 中文国产成人精品久久一 | 两个人在线观看www视频 | 国产一级二级三级在线观看 | 曰本女人一级毛片看一级毛 | 久久国产亚洲欧美日韩精品 | 国产精品片 | 中文字幕亚洲一区二区三区 | 天堂网在线www资源在线 | 国产精品一级香蕉一区 | 夜夜爽天天狠狠九月婷婷 | 大伊香蕉精品视频一区 | 久久久久久久国产免费看 | 91精品福利麻豆专区 | 色aaa | 成年免费大片黄在线观看一 | 国产91精品对白露脸全集观看 | 啦啦啦www高清在线观看影院 | 99视频全部免费精品全部四虎 | 日本高清免费h色视频在线观看 | 国产成人精品男人的天堂下载 | 欧美日韩国产一区二区三区 | 牛牛色婷婷在线视频播放 | 免费一级毛片在线播放视频 | 日本a在线观看 | 欧美日韩在线一区 | 欧美视频1 | 国产精品国产三级农村妇女 | 成人欧美日本免费观看 | 在线欧美精品一区二区三区 | 日韩成人精品 | 久草综合在线 | 天天上天天操 | 国产精品成人va在线观看 | 国产成人v视频在线观看 | 日韩欧美一区二区三区免费观看 | 亚洲日韩中文字幕在线播放 | 欧美日韩不卡高清 | 国产福利一区二区精品免费 |