6382|18

99

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

大虾米请帮忙看看程序(简单)哪里出问题了 [复制链接]

#include        \"2407C.H\"
#include           \"math.h\"



#define  PI  2*3.1415926   // 定义2π的值

float AL;
int DFLAG,N,result,result2,result3;

int t,i;
//  屏蔽中断程序        
void inline disable()
{
asm(\" setc INTM\";
}




void        interrupt nothing()
{asm(\" CLRC INTM\";
        return;                                                // 中断直接返回
}

void        interrupt tint()
{
int flag;
flag=*EVBIFRA&0x0080;
if(flag!=0x0080)
{asm(\" CLRC INTM\";
  return;}
DFLAG=1;
*CMPR4=result;
*CMPR5=result2;
*CMPR6=result3;
*EVBIFRA=0XFFFF;
asm(\" clrc INTM\");
return;
}

void   load()
{static unsigned int i=0;
i=i%20;
result=t*(0.5+AL*sin(i*PI/N));
result2=t*(0.5+AL*sin(i*PI/N+PI/3));
result3=t*(0.5+AL*sin(i*PI/N-PI/3));
i=i+1;
if(i>100) i=0;
return;}




main( )
{
int FCL,FRL;

t=2400;                                // PWM输出初始化
FCL=1000;
FRL=50;
AL=0.4;

DFLAG=1;

N=FCL/FRL;
        disable();                                                // 总中断禁止
        // 系统初始化
       
        asm(\" clrc  CNF\");            // B0被配置为数据存储空间
        *IMR=0x0002;                 // 使能第1级中断2
        *IFR=0x0FFFF;                        // 清除全部中断标志,\"写1清0\"
        *SCSR1=0x81FE;                // CLKIN=6M,CLKOUT=4*CLKIN=24M
        *WDCR=0x0E8;                // 不使能看门狗,因为SCSR2中的WD OVERRIDE
                                     // 即WD保护位,用户可通过将WDCR中的WDDIS置1来禁止WD工作
                                //   软件禁止看门狗

        *MCRC=*MCRC|0X007E;        // IOPE1-6被配置为基本功能方式,PWM7-12
        *MCRC=*MCRC|0X0600;       
       *EVBIFRA=0XFFFF;
       *T3PR=6400;
       *ACTRB=0X0666;                        // PWM12,10,8 低有效,PWM11,9,7 高有效
        *DBTCONB=0X00;                        // 不使能死区控制
        *CMPR4=0X001f;
        *CMPR5=0X002f;
        *CMPR6=0X003f;
       
        *T3CON=0X0B0E;
                          // 设置定时器3的周期寄存器,并设置CMPR4-6,以确定不
                                   // 同的输出占空比

        *COMCONB=0XA600;                        // 使能比较操作

        *T3CNT=0;                                // 定时器3为连续增计数模式
*GPTCONB=0X0041;
*EVBIMRA=0X0080;
asm(\" CLRC INTM\");
*T3CON=*T3CON|0x0040;
while(1)
{if(DFLAG==0) continue;
DFLAG=0;   
load();               //计算
}


}

最新回复

定点、浮点是对小数运算来说的。 定点:小数运算时,小数点的位置是不变的。溢出等问题靠自己提前处理才能解决。 浮点:小数运算时,小数点的位置是可变的。这是靠处理器自身来处理,所以在书上写道,速度比定点慢的原因。   详情 回复 发表于 2007-9-28 01:32
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这个用来产生SPWM波的
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
何不将正弦函数表事先算好,中断时直接查表?每次中断的间隙在主程序中计算,万一还没算完,中断发生,可能就有问题了。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
用你的程序,能看到脉宽变化的波形,你觉得波形哪儿不对呢?
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
你的计算占空比的方法是不是有问题
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 


用这个程序你可以看到脉宽的变化么?我这里就是看不到啊,要么只是一些窄脉冲,或是等宽的脉冲,反正是没有变化的一些脉冲,所以说波形不对。急死了,就是找不出原因。




 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
  我看了PWM7,PWM8两条腿,有互补的方波,脉宽是变化的。由于没有细看你的程序,无法判断脉宽变化规律是否正确。
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

8
 
对,我设置的是互补,而且我虽然觉得波形不对,但是出来的结果是互补的,可就是脉宽不会变化。不知是那里错了,很郁闷啊!

想问一下:你是用自己做的板子么?是flash烧写进去的吗?

我用的是仿真板,load的,不知道有么有影响?
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

9
 
  我用的是一块开发板,程序LOAD到 扩展RAM里运行。我看到的脉宽绝对是有变化的,
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

10
 
  load  中的:i= i% 20;
是什么意思?是否为  i = i % 200; 之误?,因为N 为 200;即变频比。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

11
 
就是 i = i%20;的错。删掉就好了。其他好像没啥问题。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

12
 
是:if(i > 0)i=0;
还是 if (i > 200) i = 0?
我觉得周期好像是200 吧。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

13
 
i= i% 20;就是占空比,是和N一样的值,调试的时候为了方便,就改成这样了

我想要一直以每个周期20个脉冲的效果生成正弦波(20个脉冲是构成它的),所以就用了取余的做法

if(i > 0)i=0;这句是应该删掉的



 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

14
 
从 sin(i*PI/N)  看,周期应该是 N, 即200,怎么会是20 呢?这一点看不懂。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

15
 
    是我看错了,N= 20;i= i%20  也是可以的。现在在我的开发板上程序运行完全正常。波形变化我觉得也是对的。程序我稍微修改了几处,似乎无关紧要。不知在你的环境下为什么不成。我想不是程序的问题。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

16
 
还有一种可能,在你的开发环境,波形可能也是变化的。但因为示波器同步不好,看不清楚。在我这儿也是这样。只有采样,停止后,才能从静止图像上明确看出脉宽以20 个脉冲为周期变化。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(中级)

17
 
给个固定的数,可以发出pwm波,但是也还是很窄的脉冲,不知道怎么了

这是程序(第一帖的)运行后的波形,大家看看是什么原因(3相都是窄的)






 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

18
 
你的程序我改过好几种变种,看波形都是对的。或者,由于 T3PR = 6400,,而 t 只取2400,调制度太小,波形变化比例不太大,看不清楚?下面的程序我刚看了波形,清楚得很,你是否拿去试试看?


#include        \"LF2407Regs.h\"
#include           \"math.h\"



#define  PI  2*3.1415926   // 定义2π的值

float AL;
int DFLAG,N;
unsigned int r1[20],r2[20],r3[20];
unsigned int xf = 0;

int t;
int i = 0;
int j = 0;
//  屏蔽中断程序        
void inline disable()
{
asm(\" setc INTM\";
}




void        interrupt nothing()
{asm(\" CLRC INTM\";
        return;                                                // 中断直接返回
}

void        interrupt tint()
{
int flag;
flag=*EVBIFRA&0x0080;
if(flag!=0x0080)
{
  return;}
DFLAG=1;
i++;
if (i >= 20 ) i = 0;
*CMPR4=r1;
*CMPR5=r2;
*CMPR6=r3;
*EVBIFRA=0XFFFF;
j++;
if (j >= 500)
  {
   j = 0;
   xf = ! xf;
  
   }
return;
}





main( )
{
int FCL,FRL;

t=6000;                                // PWM输出初始化
FCL=1000;
FRL=50;
AL=0.4;

DFLAG=1;

N=FCL/FRL;
        disable();                                                // 总中断禁止
        // 系统初始化
        
        asm(\" clrc  CNF\";            // B0被配置为数据存储空间
        *IMR=0x0002;                 // 使能第1级中断2
        *IFR=0x0FFFF;                        // 清除全部中断标志,\"写1清0\"
        *SCSR1=0x81FE;                // CLKIN=6M,CLKOUT=4*CLKIN=24M
        *WDCR=0x0E8;                // 不使能看门狗,因为SCSR2中的WD OVERRIDE
                                     // 即WD保护位,用户可通过将WDCR中的WDDIS置1来禁止WD工作
                                //   软件禁止看门狗
        for(j = 0;i < 20;i++)
          {
          r1=t*(0.5+AL*sin(i*PI/N));
          r2=t*(0.5+AL*sin(i*PI/N+PI/3));
          r3=t*(0.5+AL*sin(i*PI/N-PI/3));
          }

        *MCRC=*MCRC|0X007E;        // IOPE1-6被配置为基本功能方式,PWM7-12
        //*MCRC=*MCRC|0X0600;        
       *EVBIFRA=0XFFFF;
       *T3PR=6400;      //*周期值6400;
       *ACTRB=0X0666;                        // PWM12,10,8 低有效,PWM11,9,7 高有效
        *DBTCONB=0X00;                        // 不使能死区控制
        *CMPR4=0X001f;
        *CMPR5=0X002f;
        *CMPR6=0X003f;
        
        *T3CON=0X0B00;  //* 连续增减模式, 八分频,内部时钟,下溢重载
                          // 设置定时器3的周期寄存器,并设置CMPR4-6,以确定不
                                   // 原为0X0B0E

        *COMCONB=0XA600;    // 使能比较操作,下溢重载

        *T3CNT=0;                                // 定时器3为连续增计数模式
*GPTCONB=0X0041;
*EVBIMRA=0X0080;
asm(\" CLRC INTM\");
*T3CON=*T3CON|0x0040;
while(1)
{
asm ( \" idle\");
if (xf)
   asm ( \" setc  XF\");
else
   asm (\"  clrc  XF\");
}

 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

19
 


定点、浮点是对小数运算来说的。
定点:小数运算时,小数点的位置是不变的。溢出等问题靠自己提前处理才能解决。
浮点:小数运算时,小数点的位置是可变的。这是靠处理器自身来处理,所以在书上写道,速度比定点慢的原因。


 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表