資源簡介
用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
- 上一篇:Windows內存清理工具實現含源碼及程序
- 下一篇:二進制文件轉換成文本文件
評論
共有 條評論