新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用DSP56F805 PWM模塊輸出高頻正弦波

        用DSP56F805 PWM模塊輸出高頻正弦波

        作者: 時間:2006-06-25 來源:網絡 收藏

        針對Motorola 中不能產生正弦波的缺點,根據S原理,由直接面積等效法,計算出對應脈沖的起始點和終點,然后編程實現,經調試發現調制出的正弦波具有良好的特性。
        是一種專門用來控制電機的微處理器,內部具有各種功能,例如,A/D轉換模塊、定時器模塊等,為開發基于DSP的系統提供了很大便利。針對開發系統,Motorola為我們提供了相應的軟件開發工具CodeWarrior及SDK,使得我們開發基于Motorola DSP的系統更加方便快捷。


        1 問題的描述
        Motorola的嵌入式SDK(Software Development Kit)是一個API、庫、服務、規則的集合體,它加速了DSP的開發工作。但是,它的定時器在實現小時間定時方面的準確度卻不高,對實現正弦波(10~100kHz)有一定的難度。因此,可采用軟件延時的方法來控制脈沖序列的,這為實現正弦波奠定了基礎。另外,由于提供了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;i17;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%f”,i,y[i],xr[i],xl[i]);
        printf(“xy[%d=%d”,i+i-1,xy[i+i-1]);printf(“xy[%d]=%d”,
        i+i,xy[i+i]);
        }
        for(i=l;i9;i++)fprintf(fp,“%u,”,xy[i]);fprintf(fp,“n”);
        for(i=9;i17;i++)fprintfp.“%u,”,xy[il);fprintf(fp,“n”):
        for(i=17;i25;i++)fprintf(fp,“%u,”,xy[i]);fprintf(fp,“”);
        for(i=25;i33;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;i33;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;i32;i++,pSinDataFlF2++){
        for(j=1;J*pSinDataFlF2;j++);
        asm(bfchg#$8101,x:(PWMA-BASE+$3));
        }
        }
        }

        5 結論
        經過調試發現,輸出正弦波有很好的特性,可以謂制出不同頻率的正弦信號,在DSP的其它應用方面有一定參考價值。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 吐鲁番市| 沈丘县| 望江县| 西城区| 高阳县| 汝州市| 瑞丽市| 界首市| 策勒县| 衢州市| 博罗县| 东乡| 邯郸市| 阜新市| 桐乡市| 都昌县| 泰顺县| 西乌| 兴安盟| 略阳县| 马龙县| 贵阳市| 建瓯市| 霍林郭勒市| 金坛市| 博野县| 仁寿县| 杭锦后旗| 同德县| 泗洪县| 望城县| 武邑县| 梁山县| 塘沽区| 清流县| 思南县| 滁州市| 政和县| 六安市| 福州市| 大冶市|