当前位置:首页 > 单片机 > 单片机
[导读]摘要:介绍用高级语言C自动生成单片机的查表程序,用查表的方法取代繁琐复杂的数学运算,计算精度高、时间短。包括自动生成程序的原理以及D/A输出复杂波形、非线性插值的示例。在单片机应用系统中,常用到许多复杂的

摘要:介绍用高级语言C自动生成单片机的查表程序,用查表的方法取代繁琐复杂的数学运算,计算精度高、时间短。包括自动生成程序的原理以及D/A输出复杂波形、非线性插值的示例。

在单片机应用系统中,常用到许多复杂的数学计算,如计算sin(x)、cos(x)、有效值计算、非线性插值等。这些在高级语言中是简单的工作,而在单片机的汇编语言中却是非常复杂的。因为,这些运算大都要用乘除运算来进行近似运算,计算的精度很难满足要求。更难以接受的是其运算时间太长,这对于无乘除指令的单片机系统更是如此。采用查表取代复杂的计算是一个明智的选择。但是,这种查表程序表格往往都较长,通常为几十条到一二百条,如果采用手工输入不但要花费大量的时间,而且还容易出错。利用高级语言的单片机查表程序的自动生成技术可以大大减小工作量,而且不易出错。

用过Microchip公司的PIC16系列单片机的读者都知道,该系列单片机具有许多优点,唯感遗憾的是在该指令中没有乘除指令(PIC17以系列才有乘指令)。在应用中常要自编乘除了程序以完成乘除运算,这种程序执行都要花费较多的时间,如双字节的乘法,运算一次需要花费100多个指令周期,而如果要用乘除进行sin(x)、cos(x)、开方的计算,则花费的时间就更多。因此,利用高级语言进行单片机查表程序的自动笥成技术在PIC16系列单片机中就显得更有意义。

现以目前在我国正大量使用的Microchip公司的PIC16系列单片机为例,用几个例子说明该技术的应用。当然,这种方法也可以用在其它单片机中,只是所给的示例程序中有关单片机的语句要改为相应的单片机语言。本文采用Tubro

C作为高级语言的编程工具,也可以采用其它高级语言。

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<STdio.h>
     #include<math.h>
     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相应的值,再CALL

SUB1就可以得到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。限于篇幅,本文只给出两个实例,实际上它可以用于单片机测控系统中的许多方面,如模糊控制中的模糊规则的推理、非线性传感器的特性读取以及其它方面。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

武汉2025年9月9日 /美通社/ -- 7月24日,2025慧聪跨业品牌巡展——湖北•武汉站在武汉中南花园酒店隆重举办!本次巡展由慧聪安防网、慧聪物联网、慧聪音响灯光网、慧聪LED屏网、慧聪教育网联合主办,吸引了安防、...

关键字: AI 希捷 BSP 平板

上海2025年9月9日 /美通社/ -- 9月8日,移远通信宣布,其自研蓝牙协议栈DynaBlue率先通过蓝牙技术联盟(SIG)BQB 6.1标准认证。作为移远深耕短距离通信...

关键字: 蓝牙协议栈 移远通信 COM BSP

上海2025年9月9日 /美通社/ -- 为全面落实党中央、国务院和上海市委、市政府关于加快发展人力资源服务业的决策部署,更好发挥人力资源服务业赋能百业作用,8月29日,以"AI智领 HR智链 静候你来&quo...

关键字: 智能体 AI BSP 人工智能

北京2025年9月8日 /美通社/ -- 近日,易生支付与一汽出行达成合作,为其自主研发的"旗驭车管"车辆运营管理平台提供全流程支付通道及技术支持。此次合作不仅提升了平台对百余家企业客户的运营管理效率...

关键字: 一汽 智能化 BSP SAAS

深圳2025年9月8日 /美通社/ -- 晶泰科技(2228.HK)今日宣布,由其助力智擎生技制药(PharmaEngine, Inc.)发现的新一代PRMT5抑制剂PEP0...

关键字: 泰科 AI MT BSP

上海2025年9月5日 /美通社/ -- 由上海市经济和信息化委员会、上海市发展和改革委员会、上海市商务委员会、上海市教育委员会、上海市科学技术委员会指导,东浩兰生(集团)有限公司主办,东浩兰生会展集团上海工业商务展览有...

关键字: 电子 BSP 芯片 自动驾驶

推进卓越制造,扩大产能并优化布局 苏州2025年9月5日 /美通社/ -- 耐世特汽车系统与苏州工业园区管委会正式签署备忘录,以设立耐世特亚太总部苏州智能制造项目。...

关键字: 智能制造 BSP 汽车系统 线控

慕尼黑和北京2025年9月4日 /美通社/ -- 宝马集团宣布,新世代首款量产车型BMW iX3将于9月5日全球首发,9月8日震撼亮相慕尼黑车展。中国专属版车型也将在年内与大家见面,2026年在国内投产。 宝马集团董事...

关键字: 宝马 慕尼黑 BSP 数字化

北京2025年9月4日 /美通社/ -- 在全球新一轮科技革命与产业变革的澎湃浪潮中,人工智能作为引领创新的核心驱动力,正以前所未有的深度与广度重塑各行业发展格局。体育领域深度融入科技变革浪潮,驶入数字化、智能化转型快车...

关键字: 人工智能 智能体 AI BSP

上海2025年9月2日 /美通社/ -- 近日,由 ABB、Moxa(摩莎科技)等八家企业在上海联合发起并成功举办"2025 Ethernet-APL 技术应用发展大会"。会议以"破界•融合...

关键字: ETHERNET 智能未来 BSP 工业通信
关闭