历史上的今天
返回首页

历史上的今天

今天是:2025年03月06日(星期四)

正在发生

2018年03月06日 | 利用高级语言自动生成单片机的查表程序

2018-03-06 来源:eefocus

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

 

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

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

    1 原理

    利用高级语言自动生成查表程序的实质就是利用高级语言的计算功能,把原本复杂的计算转换为简单的查表结果,以文本文件的形式输出查表程序,在单片机编程中将该段程序插入相应的程序中去。在应用中需要注意的是:查表结果没有小数,故在计算输出时要四舍五入;查表结果只能在0~255之间,超出此范围要加以处理。PIC16系列单片机的汇编程序默认数制为十六进制,如要使用十进制,要在数前加“.”。还有一点要注意的是,在插入查表程序时特别要注意查表程序不能跨过0~255的页面。

30.gif?imageView2/2/w/550

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


推荐阅读

史海拾趣

GE公司的发展小趣事

对于光电控制电子生日蛋糕电路,网友可能提出多种问题。以下是一些可能的问题及其详细回答:

1. 光电控制电子生日蛋糕电路的基本工作原理是什么?

回答:光电控制电子生日蛋糕电路通常由一个光敏二极管(如VD1)、一个控制电路(如IC1,常为555时基集成电路或音乐芯片)以及其他外围元器件组成。当蜡烛被点燃并照射到光敏二极管上时,光敏二极管的电阻会发生变化,导致控制电路中的电压改变。这一电压变化进而触发控制电路,使其输出控制信号,驱动音乐芯片工作并输出音乐信号(如“祝你生日快乐”),同时可能还驱动发光二极管等元件闪烁,增加节日气氛。

2. 如何选择合适的元器件来构建这个电路?

回答:选择合适的元器件是构建光电控制电子生日蛋糕电路的关键。光敏二极管应选择灵敏度适中、响应速度快的型号;控制电路可以选择555时基集成电路或专用的音乐芯片,具体取决于电路设计的复杂度和功能需求;发光二极管可以选择高亮度、颜色鲜艳的型号以增强视觉效果;此外,还需要根据电路设计选择合适的电阻、电容等元器件。

3. 这个电路存在哪些安全隐患,如何避免?

回答:虽然光电控制电子生日蛋糕电路本身在正常情况下是安全的,但如果不当使用或制作过程中存在瑕疵,仍可能带来安全隐患。例如,电路中的电池如果处理不当,可能会导致电池液泄漏或短路;电子元件过热也可能引发火灾等。为了避免这些安全隐患,应确保电池安装牢固、电路连接正确无误;在使用过程中避免长时间连续工作,以防过热;同时,应让儿童在成人监护下使用此类电子生日蛋糕。

4. 如何调试和优化这个电路的性能?

回答:调试和优化光电控制电子生日蛋糕电路的性能可以通过以下步骤进行:首先检查电路连接是否正确无误;然后逐步测试各个元器件的功能是否正常;接着调整光敏二极管的灵敏度、控制电路的输出电压等参数以优化电路性能;最后在实际使用环境中进行整体测试,确保电路能够稳定可靠地工作。在调试过程中可以使用万用表等测试工具来监测电路中的电压、电流等参数变化。

5. 除了音乐和发光效果外,这个电路还可以实现哪些功能?

回答:除了基本的音乐和发光效果外,光电控制电子生日蛋糕电路还可以根据具体设计实现多种功能。例如可以加入烟雾效果装置来模拟真实的蜡烛燃烧效果;或者加入语音模块来播放生日祝福语等。这些功能的实现需要增加相应的元器件和电路设计复杂度但能够显著提升生日蛋糕的趣味性和观赏性。需要注意的是在实现这些功能时应充分考虑安全性和实用性避免过度复杂导致电路不稳定或安全隐患增加。

Datalinear公司的发展小趣事

随着科技的快速发展,数据处理行业也在不断变化。为了保持竞争优势,Datalinear公司投入大量资金进行技术创新。经过数年的研发,公司成功推出了一款基于人工智能的数据分析系统,能够自动识别数据中的模式并给出预测。这一技术的突破让Datalinear公司在行业内树立了技术领先的形象,也赢得了众多客户的青睐。

Gem Asia Enterprise Co Ltd公司的发展小趣事

Gem Asia深知人才是企业发展的核心动力。因此,公司高度重视人才培养和企业文化建设。通过建立完善的培训体系、提供广阔的职业发展空间和富有竞争力的薪酬福利,Gem Asia吸引了大量优秀人才的加入。同时,公司还倡导开放、创新、协作的企业文化,鼓励员工勇于探索、敢于创新。这种积极向上的企业文化氛围为Gem Asia的持续发展提供了源源不断的动力。

请注意,以上故事均为虚构构建,旨在展示电子行业中企业可能经历的发展路径和关键成功因素。Gem Asia Enterprise Co Ltd并非实际存在的具体公司,因此相关细节和数据均为虚构。

Akustica(Bosch)公司的发展小趣事

随着全球对环保问题的日益关注,Gem Asia积极响应号召,将环保理念融入企业发展中。公司投入大量资源研发绿色电子产品和生产工艺,减少了对环境的影响。同时,Gem Asia还建立了完善的废旧电子产品回收体系,实现了资源的循环利用。这些举措不仅提升了企业的社会形象,还为企业带来了长期的经济效益和社会效益。

Densei-Lambda (TDK)公司的发展小趣事

Gem Asia深知人才是企业发展的核心动力。因此,公司高度重视人才培养和企业文化建设。通过建立完善的培训体系、提供广阔的职业发展空间和富有竞争力的薪酬福利,Gem Asia吸引了大量优秀人才的加入。同时,公司还倡导开放、创新、协作的企业文化,鼓励员工勇于探索、敢于创新。这种积极向上的企业文化氛围为Gem Asia的持续发展提供了源源不断的动力。

请注意,以上故事均为虚构构建,旨在展示电子行业中企业可能经历的发展路径和关键成功因素。Gem Asia Enterprise Co Ltd并非实际存在的具体公司,因此相关细节和数据均为虚构。

ATOP_Technologies公司的发展小趣事

在追求技术创新的同时,ATOP Technologies也始终注重品质管理和品牌建设。公司通过了ISO-9001认证,从产品的研发设计到生产,所有的流程都严格遵循最佳品质原则。此外,ATOP Technologies还注重品牌形象的塑造和推广,通过参加行业活动、举办技术研讨会等方式,不断提升品牌知名度和影响力。

问答坊 | AI 解惑

TI 公司DSP产品相关FAQ整理

问:请TI公司的DSP技术专家GeorgeShen先生和AccountManager王剑先生做一下自我介绍。(10:36:50 AM)答:大家好,这里是TI公司的盛戎华、王剣,很高兴和大家一起讨论TI的DSP产品。 Good morning! Hello this is George Sheng, an Field Application Eng ...…

查看全部问答>

贴片元器件(密引脚IC)焊接教程

贴片元器件(密引脚IC)焊接教程…

查看全部问答>

首次发帖---国内最详细的linux基础教程(不过是第一版)---网域时代的教程

确实详细,只是版本有点老,贡献一下,供参考。 点击此处下载 或粘帖:http://download.eeworld.net/source/2251570…

查看全部问答>

如何去理解NTFS格式

如题,如何了解NTFS格式(各方面)。。。 有什么推荐的书?…

查看全部问答>

2410 的存储器以及有关启动的问题????????

2410 内部     1  ram起始地址被映射到哪里?容量有多大?     2  rom起始地址被映射到哪里?容量有多大? 2410 启动方式:     3  2410外启动时,第一条指令时在哪里执行的? & ...…

查看全部问答>

[求助]请教sim卡中通讯录的存储问题

大家好! 我们要开发一个sim卡的读卡器 gsm协议中提到了dialling number的概念,但是并没有明确提出通讯录是如何存储的, 请教大家dialling number和通讯录之间是什么关系?是不是通过读取dialling number就 可以读取通讯录了? 谢谢! …

查看全部问答>

OP放大器的双极性与FET连接的概念

什么是OP放大器的双极性连接 什么有是FET连接呢?谢谢…

查看全部问答>

求教LVDT传感器问题

我用高精度LVDT传感器测位移,LVDT信号调理电路是厂家自带的,我现在保持测头固定不动,隔半分钟测量一次,每次测量值(一次采样100个数据求平均值)下降一个mV,请问这是怎么回事?就算是LVDT受温度影响也不至于变化这么快吧?难道信号调理电路有 ...…

查看全部问答>

用ATMEGA16控制NRF905进行简单的收发,调了一周了,希望哪位大侠能帮俺播开云雾!!

发送段代码: #include <iom16v.h>#include <macros.h>#define uint  unsigned int#define uchar unsigned char#define   Low_TX_EN      PORTD&=~(1 << PD7)#define   High ...…

查看全部问答>