• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

STC12C5410AD生成SPWM请大家帮忙

最近弄了点程序(尤小翠编写)改了改,半周期256个点  是不是有点多?还有就是如何计算SPWM的频率,以及输出正弦波频率?256个点是用软件生成的,如果自己计算的话怎样算,还请各位帮忙!!!!!!以下是RC滤波双通道相加得到的波形。。附带程序

#include         
#define uint unsigned int
#define uchar unsigned char
uint pwm_1,pwm_2,m;  

uint pwm_1,pwm_2,m; 

uchar code pwm[256]={
1 ,  2 ,  4 ,  5 ,  7 ,  8 ,  10 ,  11 ,  13 ,  14 , 
 16 ,  17 ,  19 ,  20 ,  22 ,  23 ,  25 ,  26 ,  28 ,  29 , 
 31 ,  32 ,  33 ,  35 ,  36 ,  38 ,  39 ,  41 ,  42 ,  43 , 
 45 ,  46 ,  48 ,  49 ,  50 ,  52 ,  53 ,  55 ,  56 ,  57 , 
 59 ,  60 ,  61 ,  62 ,  64 ,  65 ,  66 ,  68 ,  69 ,  70 , 
 71 ,  73 ,  74 ,  75 ,  76 ,  77 ,  78 ,  80 ,  81 ,  82 , 
 83 ,  84 ,  85 ,  86 ,  87 ,  88 ,  89 ,  90 ,  91 ,  92 , 
 93 ,  94 ,  95 ,  96 ,  97 ,  98 ,  99 ,  100 ,  101 ,  102 , 
 102 ,  103 ,  104 ,  105 ,  106 ,  106 ,  107 ,  108 ,  109 ,  109 , 
 110 ,  111 ,  111 ,  112 ,  113 ,  113 ,  114 ,  114 ,  115 ,  115 , 
 116 ,  116 ,  117 ,  117 ,  118 ,  118 ,  119 ,  119 ,  119 ,  120 , 
 120 ,  120 ,  121 ,  121 ,  121 ,  121 ,  122 ,  122 ,  122 ,  122 , 
 122 ,  122 ,  122 ,  123 ,  123 ,  123 ,  123 ,  123 ,  123 ,  123 , 
 123 ,  123 ,  123 ,  122 ,  122 ,  122 ,  122 ,  122 ,  122 ,  122 , 
 121 ,  121 ,  121 ,  121 ,  120 ,  120 ,  120 ,  119 ,  119 ,  119 , 
 118 ,  118 ,  117 ,  117 ,  116 ,  116 ,  115 ,  115 ,  114 ,  114 , 
 113 ,  113 ,  112 ,  111 ,  111 ,  110 ,  109 ,  109 ,  108 ,  107 , 
 106 ,  106 ,  105 ,  104 ,  103 ,  102 ,  102 ,  101 ,  100 ,  99 , 
 98 ,  97 ,  96 ,  95 ,  94 ,  93 ,  92 ,  91 ,  90 ,  89 , 
 88 ,  87 ,  86 ,  85 ,  84 ,  83 ,  82 ,  81 ,  80 ,  78 , 
 77 ,  76 ,  75 ,  74 ,  73 ,  71 ,  70 ,  69 ,  68 ,  66 , 
 65 ,  64 ,  62 ,  61 ,  60 ,  59 ,  57 ,  56 ,  55 ,  53 , 
 52 ,  50 ,  49 ,  48 ,  46 ,  45 ,  43 ,  42 ,  41 ,  39 , 
 38 ,  36 ,  35 ,  33 ,  32 ,  31 ,  29 ,  28 ,  26 ,  25 , 
 23 ,  22 ,  20 ,  19 ,  17 ,  16 ,  14 ,  13 ,  11 ,  10 , 
 8 ,  7 ,  5 ,  4 ,  2 ,  1
}; 
//延时函数//
void delay(uint time){
    uint a=0,b;
    for(a=0;a  for(b=0;b<1200;b++);
}
//PWM initiallize//
void pwm_init()
{
   CMOD=0X02; //设置PCA计数器工作频率为F/2//
   CCON=0X00; //清零计数器和溢出标志//
   CL=0X00;   //计数器低8位和高8位全部清零//
   CH=0X00;
   CCAPM0=0X42;  //设置PWM0口//   八位pwm输出
   CCAPM1=0X42;
   CCAPM2=0X42;
   CCAPM3=0X42;
   CCAP0L=0X00;
   CCAP0H=0X00;
   CCAP1L=0X00;
   CCAP1H=0X00;
   CCAP2L=0X00;
   CCAP2H=0X00;
   CCAP3L=0X00;
   CCAP3H=0X00;
   CR=1;//开启PCA计数器//
}
void time_init()
{
  TMOD|=0X01;//定时器0工作在模式1// (模式一16位定时器)
  TH0=0Xff;
  TL0=0xe9;   //160个点晶振12M   50Hz*2*159=15900个点   调整TL0使输出频率为50Hz左右//
  ET0=1; //开定时器0中断//
  TR0=1;//开启定时器0//      
}
//软启动//
void soft_start(void)
{
 m=0;
 do
 {
     m=m+27;
     delay(12);
 }
  while(m<216);  
}
//SPWM实现//
void int_time0(void) interrupt 1
{
 TH0=0Xff;
 TL0=0Xe9;//重装计数值//
 TR0=1;
 CCAP0H=pwm1;
 CCAP2H=pwm1;
 CCAP1H=pwm2; //装入脉宽值//
  CCAP3H=pwm2;
  k++;
    if(k<256) //正半周//
 {
  i=k;
  pwm_1=m*pwm[i]/216;
     pwm1=(uchar)pwm_1;
  pwm2=0;
 }
   else if(k<512) //负半周//
 {   
  j=k-256;
  pwm1=0;
  pwm_2=m*pwm[j]/216;
     pwm2=(uchar)pwm_2;
  pwm1=0;
    }
   else
 {//周期结束//
  k=0;
  i=k;
  pwm_1=m*pwm[i]/216;
  pwm1=(uchar)pwm_1;
        pwm2=0;
 }
}
//主程序//
void main()
{
 pwm_init();  //各种初始化
 time_init();
 EA=1;
// soft_start();
 m=300;
 while(1);
}

  

全部回复(11)
正序查看
倒序查看
廖远方
LV.9
2
2012-12-05 21:58
懂得C语言就是好.想要什么样的功能就有什么样的功能!实在是佩服.顶一个!
0
回复
2012-12-05 22:10
@廖远方
懂得C语言就是好.想要什么样的功能就有什么样的功能!实在是佩服.顶一个!
**此帖已被管理员删除**
0
回复
2012-12-05 22:15
@鹏城快易贷
**此帖已被管理员删除**

打广告这位请你移驾

0
回复
2012-12-07 16:58
@loudianxin
打广告这位请你移驾
自己顶     各位都感到太简单  不屑回答呀!您的指导是我进步的源泉呀!
0
回复
黑夜11
LV.5
6
2012-12-07 18:55
@loudianxin
自己顶    各位都感到太简单 不屑回答呀!您的指导是我进步的源泉呀!
开环?加行ad采样吧,稳压效果才能实现
0
回复
2012-12-08 19:20
@黑夜11
开环?加行ad采样吧,稳压效果才能实现
现在还不考虑加,因为我现在还不知怎样计算SPWM的频率  以及输出正弦波的频率   一步一步来 。查了些资料也没找到说明的
0
回复
2013-04-08 10:20
@loudianxin
现在还不考虑加,因为我现在还不知怎样计算SPWM的频率 以及输出正弦波的频率  一步一步来。查了些资料也没找到说明的
我也正在研究这个,还有好多地方不懂啊!向楼主学习
0
回复
2013-07-10 09:26
@loudianxin
现在还不考虑加,因为我现在还不知怎样计算SPWM的频率 以及输出正弦波的频率  一步一步来。查了些资料也没找到说明的
楼主,您好,现在才看到你张帖,不知道你解决你问题没有,我现在才开始学用单片机通过DDS技术产生SPWM的方法,好多地方都不懂,上网也找不到解决方法,请您教教我,我也是学生。
0
回复
loudianxin
LV.7
10
2013-07-19 20:53
@守稻者0
楼主,您好,现在才看到你张帖,不知道你解决你问题没有,我现在才开始学用单片机通过DDS技术产生SPWM的方法,好多地方都不懂,上网也找不到解决方法,请您教教我,我也是学生。

最近没时间弄这个了,不过想一起讨论讨论,我QQ:525658917   注明:电源网

0
回复
07611128
LV.2
11
2013-07-25 20:47
@loudianxin
最近没时间弄这个了,不过想一起讨论讨论,我QQ:525658917  注明:电源网

depth=1024;
widths=10;
n=0:1:depth;
s=sin(pi*n/512);
My_sin=fopen(sin.mif,wt);

fprintf(My_sin,depth=%d;\n,depth);
fprintf(My_sin,width=%d;\n,widths);
fprintf(My_sin,address_radix=dec;\n);
fprintf(My_sin,data_radix=dec;\n);
fprintf(My_sin,ContentBegin\n);
for(x=1:depth)
    fprintf(My_sin,\%d:%d;\n,x-1,round(511*sin(pi*(x-1)/512)+512));
end
fprintf(My_sin,end;);
fclose(My_sin);

可以用matlab去计算一个正弦的数的,设置位宽和深度,产生了一个mif文件,我是用于fpga的,学生党

0
回复
2013-09-01 11:24
前辈,您那个生成spwm波那些点的软件可以给我发一个吗?我的邮箱378105653@qq.com,谢谢了,我自己在网上收不着合适的
0
回复