×
嵌入式 > 技术百科 > 详情

用DSP56F805 PWM模块输出高频

发布时间:2021-06-02 发布时间:
|

针对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 target="_blank" >28318;
xy[2i]=(xl[i]一xr[i])50000/6.28318;
printff“y[%d]=%f%f%f\n”,i,y[i],xr[i],xl[i]);
printf(“xy[%d=%d”,i+i-1,xy[i+i-1]);printf(“xy[%d]=%d\n”,
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/(10fs)
其中fs-600。
因此,输出一个周期正弦波算法的流程图如图3所示。

具体实现程序如下:
void spwmgenerate(uwordl6 fi,uwordl6 f2){
intl;
uwordl6j;
uwordl6psindataflf2;
asm(bfclr#$8101,x:(pwma_base+$3))
while(spwmrun){
psindataflf2=psindataflf2reg;
for(i=0;i<32;i++,psindataflf2++){
for(j=1;j asm(bfchg#$8101,x:(pwma-base+$3));
}
}
}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
基于POE技术的船用视频监控系统硬件设计