老古开发网首页
导航:老古开发网首页文章索引文章分类嵌入式系统→[MCS-51单片机中计算正弦函数的一种方法]
| -文章搜索 - 最新文章 - |

MCS-51单片机中计算正弦函数的一种方法

发布时间:2006年2月25日 点击次数:1447
来源:单片机与嵌入式系统应用   作者:井冈山师范学院 彭宣戈 章琛
 
MCS\ 51单片机中计算正弦函数的一种方法 井冈山师范学院彭宣戈章 琛 摘要详细论述高速度、高精度要求下,在MCS\ 51单片机中计算正弦函数的原理、步骤和设计方法,并且给出全部程序。文中叙述的计算方法,在0~π/2之间的计算时间,且在12MHz时钟下为96μs;在π/2~2π之间则为108μs。文中给出的程序清单可直接嵌入到MCS\ 51系列单片机应用系统中。 关键词MCS\ 51单片机正弦函数计算方法 在MCS\ 51单片机的应用过程中,会遇到需要计算正弦函数的问题。众所周知,在单片机控制的应用中,首先是要求实时性,即高速度;其次是要求计算达到高精度。本文叙述的计算方法,在0~π/2之间的计算速度为1152个状态周期(12MHz时为96μs),在(π/2)~2π之间的计算速度为1296个状态周期(12MHz时为108μs)。这种方法的计算精度较高,完全可以直接嵌入到采用MCS\ 51系列单片机的应用系统中。 一、 设计依据 1 数学原理 为实现本计算方法,先证明以下结论。 设\[x0,x0+Δx\]\[0,π/2\],则x∈\[x0,x0+Δx\],令δ=x-x0,并设: f(δ)=sinx0+\[sin(x0+Δx)-sinx0\]δ[]Δx 则有 sinx-f(δ) ≤1[]4Δxcosx0(1) 证明:y=sinx在\[ 0,π/2 \]内,也即在\[x0,x0+Δx\]内为严格凹函数,则 sinx=sin(x0+δ)≥sinx0+ \[sin(x0+Δx)-sinx0\]δ[]Δx=f(δ) 从而有: 0≤sinx-f(δ)=sin(x0+δ)-f(δ)= sin(x0+δ)-sinx0-\[sin(x0+Δx)-sinx0\]δ[]Δx= \[sin(x0+δ)-sinx0\]Δx-δ[]Δx- \[sin(x0+Δx)-sin(x0+δ)\]δ[]Δx≤ 2sinδ[]2cosx0+δ[]2Δx-δ[]Δx≤ 2Δx-δ[]Δx δ[]2cosx0=δ(Δx-δ)[]Δxcosx0≤Δx[]4cosx0 基于以上原理,将\[ 0,π/2 \]分成128等分,事先计算出129个等分点的函数值,制成函数表编进程序中,供查表用。这样,对于任意处于0~π/2之间的x,它必定落在某两个相邻的等分点的区间上,可从上述函数表中查出该相邻的等分点的函数值,并算出余量δ=x-x0。用f(δ)的值作为sinx 的近似值。由式(1)可知,这时的误差小于π[]2×128×1[]4×cosx0≈0.00307cosx0;而当x0=0时,因f(δ)=δsinΔx[]Δx≈δ·1=x-0=x,从而limn→∞f(δ)-sinx[]x3≈limn→∞x-sinx[]x3=limn→∞1-cosx[]3x2=limn→∞sinx[]6x=1[]6,故f(δ)=sinx+O(x3)。所以,这时的实际误差约为 δ3≤(Δx)3=π[]2563≈0.0000018,完全满足要求。 为了实现运算的高速度,同时又能保证计算的高精度,本算法采用定点的16位二进制计算。 2. 算法原理 根据式(1),对于每个x,都必落在某个闭区间\[x0,x0+Δx\]内,令M=sinx0,N=sin(x0+Δx),又δ=x-x0,所以可用下面的公式具体实现算法,即 sinx=M+\[(N-M)/ 0080H\]δ= M+(N-M)·δ·2-7= M+2(N-M)·δ·2-8= {2M+2\[(2N-2M)·δ·2-8\]+1}/2(2) 其中加1为舍入处理。 二、 设计方法 1. 设定数据格式 采用定点的16位二进制计算,其格式是:在程序中参与运算的实数为带符号的实数,即D15位为符号位,从D14位开始的权为1,以后各位的权依次为0.5,0.25,0.125,…,1/214。负数以补码的形式表示。 在程序中参与运算的角度值同样为16位带符号的定点格式,即D15位为符号位,从D14位开始的权为90°,以后各位的权依次为45°,22.5°,11.25°,…,90°/215。负数以补码的形式表示。 2. 制成正弦函数表 正弦函数表的数据格式和前面介绍的一样,只是不需要符号位。16位数据全部用作表格数据,即D15位的权为1,从D14位开始,以后各位的权依次为0.5,0.25,0.125,…,1/215。这样多1个表示位,又进一步提高了计算精度。 从式(2)中可以看出,每次查表取值都要乘以2。因此,为了节约时间,提高计算精度(多1个表示位)和运算速度(省去2个左移指令),实现正弦函数表的数据都是sinx的2倍。在生成时干脆形成2倍sinx的正弦函数表。本函数表利用Basic语言生成,其程序编制如下: DIM x(129) FOR i=1 TO 128 n$="" m$="" x(i)=3.1415926535# / 256 * i y=SIN(x(i)) j=y z=0.5 FOR k=1 TO 15 IF j >= z THEN j=j - z m$="1" ELSE m$="0" END IF n$=n$ + m$ z=z / 2 NEXT k PRINT "x"; i; "="; x(i), y, n$ NEXT i END 3. 进行余量分割 前述每个函数占2字节,我们在\[0,π/2\]间分成128等分,含129个数据。因此,所对应的函数值占129×2=258字节。显然,这时Δx=90°/128,化成二进制用十六进制格式表示,其值为0080H。 那么,对于任意的x<90°,有x=x+δ(其中δ为余量)。用16位二进制数表示后,将其分割为x和δ两部分:x为前9位二进制值;δ为x的后7位二进制值(用H表示)。由于MCS\ 51单片机为8位机,故实际运算时按双字节分开运算。即只要将低8位左移一次,放入标志位C,然后再对低8位屏蔽,这样就完成了余量分割。 x的高8位,将x向右移1位为本身数据,再右移1位就形成查表偶地址值(用x表示)。这里,当角度为最大90°时,x=0100H。 4. 完成角度转换 正弦函数的角度有4个象限,上面描述的角度数据范围为-π~π的角度值。但实际计算的角度值在0~π/2之间,因此就有一个角度转换的问题。 首先,判断次高位是否为1(即90°):是,则角度求补,再去掉最高位;否则,直接去掉最高位。这样,就将-π~π的角度值变换到0~π/2的角度值。然后,用这个变换后的角度值去进行运算,结果再进行一次符号处理和符号变换,就可成为原角度的函数值。即当原角度处于第1和2象限时,函数值为正,不必变换;当原角度处于第3和4象限时,函数值为负,进行变换。 三、 程序编制 本程序的入口参数在R6和R7:R6为高8位,R7为低8位;出口参数在R5和R6:R5为高8位,R6为低8位。 〖2〗ORG〖〗1000〖1〗STAR:〖〗MOV〖〗A,R6〖2〗PUSH〖〗ACC〖2〗JNB〖〗ACC.6,L001〖〗; 角度变换〖2〗CPL〖〗A〖2〗MOV〖〗R6,A〖2〗MOV〖〗A,R7〖2〗CPL〖〗A〖2〗ADD〖〗A,#01H〖2〗MOV〖〗R7,A〖2〗CLR〖〗A〖2〗ADDC〖〗A,R6〖1〗L001:〖〗CLR〖〗ACC.7〖〗; 余量分割〖2〗MOV〖〗R6,A〖2〗MOV〖〗A,R7〖2〗RLC〖〗A〖2〗ANL〖〗R7,#7FH〖2〗MOV〖〗A,R6〖2〗RLC〖〗A〖2〗CLR〖〗C〖2〗RLC〖〗A〖2〗MOV〖〗DPTR,#BIAO〖2〗JNC〖〗L002〖2〗INC〖〗DPH〖1〗L002:〖〗MOV〖〗R0,A〖〗; 表格指针形成〖2〗MOVC〖〗A,@A+DPTR〖2〗MOV〖〗R2,A〖2〗INC〖〗R0〖2〗MOV〖〗A,R0〖2〗MOVC〖〗A,@A+DPTR〖2〗MOV〖〗R3,A〖2〗INC〖〗R0〖2〗MOV〖〗A,R0〖2〗MOVC〖〗A,@A+DPTR〖2〗MOV〖〗R4,A〖2〗INC〖〗R0〖2〗MOV〖〗A,R0〖2〗MOVC〖〗A,@A+DPTR〖2〗MOV〖〗R5,A〖2〗CLR〖〗C〖2〗SUBB〖〗A,R3〖〗; M-N〖2〗MOV〖〗R5,A〖2〗MOV〖〗A,R4〖2〗SUBB〖〗A,R2〖2〗MOV〖〗R4,A〖2〗MOV〖〗A,R5〖2〗CLR〖〗C〖2〗RLC〖〗A〖2〗MOV〖〗R5,A〖2〗MOV〖〗A,R4〖2〗RLC〖〗A〖2〗MOV〖〗R4,A〖1〗CHEN:〖〗MOV〖〗A,R5〖〗; *δ〖2〗MOV〖〗B,R7〖2〗MUL〖〗AB〖2〗XCH〖〗A,R7〖2〗MOV〖〗R5,B〖2〗MOV〖〗B,R4〖2〗MUL〖〗AB〖2〗ADD〖〗A,R5〖2〗MOV〖〗R6,A〖2〗CLR〖〗A〖2〗MOV〖〗ACC.0,C〖2〗MOV〖〗C,F0〖2〗ADDC〖〗A,B〖2〗INC〖〗R6〖〗; 舍入处理〖2〗ADDC〖〗A,#00H〖2〗MOV〖〗R5,A〖2〗MOV〖〗A,R3〖2〗ADD〖〗A,R6〖2〗MOV〖〗R6,A〖2〗MOV〖〗A,R2〖2〗ADDC〖〗A,R5〖2〗MOV〖〗R5,A〖2〗CLR〖〗C〖2〗RRC〖〗A〖2〗MOV〖〗R5,A〖2〗MOV〖〗A,R6〖2〗RRC〖〗A〖2〗MOV〖〗R6,A〖2〗POP〖〗A〖2〗JNB〖〗ACC.7,L003〖〗;符号处理〖2〗MOV〖〗A,R5〖2〗SETB〖〗ACC.7〖2〗MOV〖〗R5,A〖1〗L003:〖〗RET〖2〗ORG〖〗1200〖1〗BIAO:〖〗DW〖〗0000H,0192H,0324H〖〗;表格数据〖2〗DW〖〗04B6H,0647H,07D9H〖2〗DW〖〗096AH,0AFBH,0C8BH〖2〗DW〖〗0E1BH,0FABH,1139H〖2〗DW〖〗12C8H,1455H,15E2H〖2〗DW〖〗176DH,18F8H,1A82H〖2〗DW〖〗1C0BH,1D93H,1F19H〖2〗DW〖〗209FH,2223H,23A6H〖2〗DW〖〗2528H,26A8H,2826H〖2〗DW〖〗29A3H,2B1FH,2C98H〖2〗DW〖〗2E11H,2F87H,30FBH〖2〗DW〖〗326EH,33DEH,354DH〖2〗DW〖〗36BAH,3824H,398CH〖2〗DW〖〗3AF2H,3C56H,3DB8H〖2〗DW〖〗3F17H,4073H,41CEH〖2〗DW〖〗4325H,447AH,45CDH〖2〗DW〖〗471CH,4869H,49B4H〖2〗DW〖〗4AFBH,4C3FH,4D81H〖2〗DW〖〗4EBFH,4FFBH,5133H〖2〗DW〖〗5269H,539BH,54CAH〖2〗DW〖〗55F5H,571DH,5842H〖2〗DW〖〗5964H,5A82H,5B9DH〖2〗DW〖〗5CB4H,5DC7H,5ED7H〖2〗DW〖〗5FE3H,60ECH,61F1H〖2〗DW〖〗62F2H,63EFH,64E8H〖2〗DW〖〗65DDH,66CFH,67BDH〖2〗DW〖〗68A6H,698CH,6A3DH〖2〗DW〖〗6B4AH,6C24H,6CF9H〖2〗DW〖〗6DCAH,6E96H,6F5FH〖2〗DW〖〗7023H,70E2H,719EH〖2〗DW〖〗7255H,7307H,73B5H〖2〗DW〖〗745FH,7504H,75A5H〖2〗DW〖〗7641H,76D9H,776CH〖2〗DW〖〗77FAH,7884H,7909H〖2〗DW〖〗798AH,7A05H,7A7DH〖2〗DW〖〗7AEFH,7B5DH,7BC5H〖2〗DW〖〗7C29H,7C89H,7CC3H〖2〗DW〖〗7D39H,7D8AH,7DD6H〖2〗DW〖〗7E1DH,7E5FH,7E9DH〖2〗DW〖〗7ED5H,7F09H,7F38H〖2〗DW〖〗7F62H,7F87H,7FA7H〖2〗DW〖〗7FC2H,7FD8H,7FE9H〖2〗DW〖〗7FF6H,7FFDH,7FFFH〖2〗END四、 结果分析 实际应用结果如表1所示,完全符合实际的需要。 表1 角度值〖〗定点角度值〖〗浮点函数值〖〗定点函数值〖〗实际结果〖〗误差2.0〖〗016CH〖〗003489950〖〗023CH〖〗023CH4.0〖〗02D8H〖〗006975650〖〗0476H〖〗0476H8.0〖〗05B0H〖〗013917310〖〗08E8H〖〗08E7H〖〗1H22.0〖〗0FA5H〖〗037460660〖〗17FAH〖〗17F9H〖〗1H25.0〖〗11C7H〖〗042261830〖〗1B0CH〖〗1B0CH30.0〖〗1555H〖〗050000000〖〗2000H〖〗1FFFH〖〗1H42.0〖〗1DDEH〖〗066913060〖〗2AD3H〖〗2AD3H45.0〖〗2000H〖〗070710680〖〗2D41H〖〗2D41H46.0〖〗20B6H〖〗071933980〖〗2E0AH〖〗2E0AH60.0〖〗2AABH〖〗086602540〖〗376DH〖〗376DH72.0〖〗3333H〖〗095105650〖〗3CDEH〖〗3CDEH75.0〖〗3555H〖〗096592580〖〗3DD1H〖〗3DD1H84.0〖〗3BBCH〖〗099452190〖〗3FA6H〖〗3FA6H88.0〖〗3E94H〖〗099939080〖〗3FF6H〖〗3FF6H90.0〖〗4000H〖〗1.00000000〖〗4000H〖〗4000H可见,结果只差1个二进制位,精度已达1/214。该程序模块可直接引用。MES 参考文献 1何立民单片机应用系统设计. 北京:北京航空航天大学出版社,1995 2彭宣戈软麻乳化液率自动控制系统. 微计算机信息,1997(1):39

欢迎进入老古论坛进行讨论
[嵌入式系统] 相关文章:
电饭煲模糊控制系统的设计
简介:
电饭煲模糊控制系统的设计 上海红心器具有限公司胡念平 摘要从硬件和软件上介绍模糊理论控制电饭煲烧饭的工作原理和整个过程,并简要介绍美国Microchip公司PIC芯片在电饭煲中的具体使用。 关键词电饭煲模糊控制单片机 模糊电饭煲与传统的电饭煲相比具有许多优越性。首先,它能根据锅内的米量、水量按要求选择最佳方式,从而做出合适的控制对策,这样既省电,煮出的米饭又松软可口;其次,它功能多,操作简便。本文重点介绍如何将模糊逻辑应用于电饭煲的温度控制过程以及具体实现方法。 一、 米饭的烹饪过程分析 要想做出松软香滑的米饭,必须掌握加热对象的性质以及详细的加热过程,只有这样,才能够将大米中不易溶于水且难......

模拟比较器的应用(四)
通过无线收发芯片实现的单片机DCTMS技术
P87LPC764位方式I²C总线编程规范
IC智能卡芯片AT45D041的原理及应用
PIC16F87X单片机中断系统应用必须关注的问题
用MAX813L设计单片机看门狗与电源监控电路
用MAX3100 UART构成RS-485通信网络
用Win32 API实现PC机与多单片机的串行通信
按通用操作格式设计的多机通信软件
 
下一个:[嵌入式系统]用单片机实现野外作业仪表的加热和备用电池充电
简介:
用单片机实现野外作业仪表的加热和备用电池充电 天津大学电子信息工程学院于振生 摘要给出电子设备为适应野外的恶劣环境条件所采取的解决问题的方案,包括液晶显示器和仪器机箱的加热、仪器备用电池的充电等具体的控制电路和充电电路。在不改变原仪表配置的基础上,只通过少量的投入就能很好地解决问题。 关键词加热野外作业电池充电液晶显示器 图1加热控制电路用于野外的电子设备必须解决2个最重要的问题,即供电和适应恶劣的环境条件(尤其是低温环境)。由于仪器设备使用的是商用器件,其低温工作的条件是0℃。特别是低温液晶显示屏,其价格很高,无形中提高了仪器设备的造价。在不改变原仪表配置的基础上,只通过少量的投入就能较好......
 

上一个:[嵌入式系统]用PIC单片机普通I/O脚检测模拟信号

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:10分钟 执行时间:16毫秒