用DSP56F805 PWM模块输出高频正弦波

发布者:bin0990最新更新时间:2007-03-09 手机看文章 扫描二维码
随时随地手机看文章
针对Motorola DSP56F805的PWM模块中不能产生高频正弦波的缺点,根据SPWM原理,由直接面积等效法,计算出对应脉冲的起始点和终点,然后编程实现,经调试发现调制出的正弦波具有良好的特性。 DSP56F805是一种专门用来控制电机的微处理器,内部具有各种功能模块,例如,A/D转换模块、PWM模块、定时器模块等,为开发基于DSP的系统提供了很大便利。针对开发系统,Motorola为我们提供了相应的软件开发工具CodeWarrior及SDK,使得我们开发基于Motorola DSP的系统更加方便快捷。 1 问题的描述 Motorola的嵌入式SDK(Software Development Kit)是一个API、库、服务、规则的集合体,它加速了DSP的开发工作。但是,它的定时器在实现小时间定时方面的准确度却不高,对实现高频正弦波(10~100kHz)有一定的难度。因此,可采用软件延时的方法来控制脉冲序列的输出,这为实现高频正弦波奠定了基础。另外,由于DSP56F805提供了PWM模块,主要用于电机控制,输出为PWM0一WM5六路输出,为电机控制提供了方便。但是该模块不能提供高频输出,在实现高频正弦波调制方面是个难点。因此,笔者没有利用PWM模块,而是采用通用I/0口作为输出。 2 脉宽的求解原理 直接面积等效法的原现可用图1予以说明。任取正弦波中的一个小区间△t,相正弦波面积为S1,所要产的PWM脉冲面积S2与S1等。在正弦波与脉冲高度知的条件下,可计算出脉宽度ζi。从而`得到对应的开关点,计算出一个正弦波周期内所对应所有脉冲高度已知的条件,可计算出一个正弦波周期内所对应怕有脉冲序列相对应时间的位置。 根据具体的计算公式,可利用C语言编程计算出脉冲序列中每个脉冲的相对宽度及位置,如下所示: main() { unsignedinti; float del,del2,x[20],xz[20],xl[20],xr[20],y[20]; unsigned int xy[34]; if(fp=fopen(“d600”,“w”)==NULL) {pfintff“can’t openthisfile\n”;exit(O);} del=3.14159/8; del2=3.14159/16; x[O]=O; xl[O]=O: for(i=1;i<17;i++) { x[i]=i*3.14159/8; xz[i]=x[i-1]+del2; y[i]=del+cos(x[i-1])一cos(x[i]); xl[i]=xz[il+y[i]/4; xr[i]=xz[i]-y[i]/4; xy[2*i-1]=(xT[i]-xl[i-1])*50000/6 28318; xy[2*i]=(xl[i]一xr[i])*50000/6.28318; printff“y[%d]=%f%f%fn”,i,y[i],xr[i],xl[i]); printf(“xy[%d=%d”,i+i-1,xy[i+i-1]);printf(“xy[%d]=%dn”, i+i,xy[i+i]); } for(i=l;i<9;i++)fprintf(fp,“%u,”,xy[i]);fprintf(fp,“n”); for(i=9;i<17;i++)fprintfp.“%u,”,xy[il);fprintf(fp,“n”): for(i=17;i<25;i++)fprintf(fp,“%u,”,xy[i]);fprintf(fp,“n”); for(i=25;i<33;i++)fprintf(fp,“%u,”,xy[i]);fprintfffp,“n”); fclose(fp); 计算结果为: xy[321={1562,1865,979,2425,485,2853,155,3085,39,3085,155,2853,485,2425,979,1865,1562,1259,2145,699,2639,27l,2969,39,3085,39,2969,27l,2639,699,2145,1259}; 由此便得到一周期内所对应16个脉冲序列的相对位置xy[1]"xy[31]。如果想得到所需要的频率,还需要对直接面积等效法的原理可用图1予以说明。任取正其进行相应的变换。 3 硬件电路 采用通用输出口PB0作为脉冲输出口,然后配以简单的阻容电路进行滤波,便可实现所需的各种频率的高频正弦波。正弦波输出电路如图2所示。 4 软件设计 根据计算出的脉冲开关时间点,通过软件延时的方法来控制每个脉冲的开关时间,以完成脉冲输出的程序。但是,如果想得到相应的频率,必须对xy[i]作相应的变换。 以一个周期16个脉冲为例,计算出一个基准周期内各个脉冲的起停位置xy[1]"xy[31],如果需要其它频率值,可通过相应的数值变换得到。 例如,要获得6OOHz的正弦波,作如下变换: for(i=0;i<33;i++) SinDataF2[i]=(UWord32)xy[i]*237/(10*Fs) 其中Fs-600。 因此,输出一个周期正弦波算法的流程图如图3所示。 具体实现程序如下: void SpwmGenerate(UWordl6 FI,UWordl6 F2){ intl; UWordl6j; UWordl6*pSinDataFlF2; asm(bfclr#$8101,x:(PWMA_BASE+$3)) while(SpwmRun){ pSinDataFlF2=pSinDataFlF2reg; for(i=0;i<32;i++,pSinDataFlF2++){ for(j=1;J<*pSinDataFlF2;j++); asm(bfchg#$8101,x:(PWMA-BASE+$3)); } } } 5 结论 经过调试发现,输出正弦波有很好的特性,可以谓制出不同频率的正弦信号,在DSP的其它应用方面有一定参考价值。
引用地址:用DSP56F805 PWM模块输出高频正弦波

上一篇:用DSP实现增量式光电编码器的细分
下一篇:基于DSP的谐波控制器的研制

小广播
最新应用文章
换一换 更多 相关热搜器件

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 医疗电子 工业控制

词云: 1 2 3 4 5 6 7 8 9 10

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved