• 大小: 8KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-26
  • 语言: C/C++
  • 标签: DSP  spwm  C语言  

资源简介

用DSP实现spwm的C语言程序 简单易行

资源截图

代码片段和文件信息

/*
09.10.23  09.10.24 实现
尝试发出PWM波形采用对称规则采样法。
三相发出的正弦波都很完美。唯一的问题是中断函数执行了160us有点时间太长了
总共也就200us的时间。看能否想办法再精简程序
采用汇编则可采用角度查询法,当然需要360°的sin值表
RC滤波器参数:0.1uF、10k      加上窄脉冲删除  94us
*/
#include “SEED-DEC2407.h“

void initial();
void bad_trap();
unsigned long int gettime();
void look_up_sin ();

/*unsigned int i=0j=0l=0;
unsigned long int k=0t=0N=0M=9;//M值的大小和Fc有关系, 
//Ud不变,Uc随着Fc的改变而改变,所以M=Uc/Us值改变。
unsigned long int tm1=0tm2=0tm3=0;
unsigned int ADAcount=0ischange=0result=0F_modu=50;*/

// 一些中间的运算变量,到时候能删的全部删掉
unsigned int Nk;              //N为载波比  N=Fc/F_mode=5000/50=100
extern unsigned int sintab[1801];  
unsigned int Temp0=0Temp1=0Temp2=0;
signed int Tmp0=0Tmp1=0Tmp2=0Tmp3Tmp4Tmp5;
signed long var1var2var3;
signed int sinwtcoswt;
signed int sinwt_csinwt_bsinwt_acoswt_a; 
  
main()
{   
N=5000/50;
    initial();                         //系统初始化
    while(1)
    {
*PEDATDIR=*PEDATDIR & 0xFFF9;    //输出低电平
}

void initial(void)
{
 asm(“ setc INTM“);                //禁止所有可屏蔽中断
     asm(“ clrc SXM“);                 //抑制符号扩展。SXM=1时,数据通过定标移位器
     //传送到累加器时将产生符号扩展
     asm(“ clrc OVM“);            //OVM清零累加器中结果正常溢出
     asm(“ clrc CNF“);                 //CNF清零B0被设置为数据存储区
     
 *WDCR=0x68 ;                      //看门狗定时控制寄存器,禁止看门狗
     *SCSR1=0x81fe;                    //系统控制及状态寄存器1,CPU时钟频率设置
     //设为40MHZ
     //*SCSR2&=0x000e;    //SARAM配置为内部数据MEM  ?
 //*XINT1CR=*XINT2CR=0x8006;       //禁止外部中断
     //*WSGR=0x0000;                   //设置外部存储器的接口不插入等待状态
          
     *IFR=0xffff;                      //清所有系统中断标志
 *IMR=0x0002;                      //开 INT2  中断   
 *EVAIFRA=0xffff;                  //清事件管理器A所有中断标志 
 *EVAIFRB=0xffff;                  //清事件管理器A所有中断标志 
 *EVAIFRC=0xffff;                //清事件管理器A所有中断标志 
     *EVAIMRA=0x0200;                //T1下溢中断  使能T1PINT 
 *EVAIMRB=0;                    //屏蔽所有中断
 *EVAIMRC=0;                       //屏蔽所有中断
 
 /**ADCTRL1= 0x0900;            //设置连续转换模式
 *MAXCONV = 0x0;            //每次完成转换1个通道
 *CHSELSEQ1=0x0;                // ADCIN0
 *ADCTRL2= 0x2000;                 //启动转换*/ 
 //IO口引脚设置
     *MCRA=*MCRA|0x0fc0;               //设置PWM1~6引脚
     *MCRC=*MCRC & 0xFFF9;    //PWM7/8配置为通用输出口,测试用
 *PEDATDIR|=0x0600;
 //PWM发生器设置(EVA)
 *ACTRA=0x0999;                    //引脚PWM1、3、5低有效,PWM2、4、6高有效。
 *T1PR=4000;                       //T1周期寄存器值为4000,载波频率为5k
 *CMPR1=4000;                      //比较器的比较值,开始时占空比初始值0%
 *CMPR2=4000;
 *CMPR3=4000;
     *T1CNT=0;                         //定时器1计数寄存器   
 *DBTCONA=0x08f4;                  //死区周期值为8,死区预分频系数为32,
 //死区值为7×32=224个CPU时钟周期CPU时钟周期为50ns,定时器周期为8×32×25ns   6.4us 
     *COMCONA=0x8200;                  //比较控制寄存器A 输出使能,下溢重载
     //当计数器T1CNT=0(下溢)时重载
 *T1CON=0x0842;                    //定时器1控制寄存器 F=1连续增减计数方式
     asm(“ clrc INTM“);                //开总中断     
}
void look_up_sin (void)
{
  switch(Temp1)
{case 0:
  asm(“ L

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       7154  2010-03-16 21:06  spwm程序\SPWM.c

     文件      13569  2010-03-16 21:06  spwm程序\vectors.asm

     目录          0  2010-03-25 09:42  spwm程序

----------- ---------  ---------- -----  ----

                20723                    3


评论

共有 条评论