资源简介
用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内存清理工具实现含源码及程序
- 下一篇:二进制文件转换成文本文件
相关资源
- 操作系统c语言模拟文件管理系统844
- C语言开发实战宝典
- C++中头文件与源文件的作用详解
- C语言代码高亮html输出工具
- 猜数字游戏 c语言代码
- C语言课程设计
- 数字电位器C语言程序
- CCS FFT c语言算法
- 使用C语言编写的病房管理系统
- 通信过程中的RS编译码程序(c语言)
- 计算机二级C语言上机填空,改错,编
- 用回溯法解决八皇后问题C语言实现
- 简易教务管理系统c语言开发文档
- 操作系统课设 读写者问题 c语言实现
- 小波变换算法 c语言版
- C流程图生成器,用C语言代码 生成C语
- 3des加密算法C语言实现
- 简单的C语言点对点聊天程序
- 单片机c语言源程序(51定时器 八个按
- 个人日常财务管理系统(C语言)
- c语言电子商务系统
- 小甲鱼C语言课件 源代码
- 将图片转换为C语言数组的程序
- C语言实现的一个内存泄漏检测程序
- DES加密算法C语言实现
- LINUX下命令行界面的C语言细胞游戏
- 用单片机控制蜂鸣器播放旋律程序(
- 学校超市选址问题(数据结构C语言版
- 电子时钟 有C语言程序,PROTEUS仿真图
- 尚观培训linux许巍老师关于c语言的课
评论
共有 条评论