spwm波生成的小软件附所有的代码

可生成exe文件
有三个参数
1.A振幅
2.D要产生的离散的点的数
3.F频率
振幅随便设,会在控制台显示但是没有什么用
D的话就是离散的点的数比如
设置成5那么就会产生sin(0X2Xpi/4)=0
sin(1X2Xpi/4)=1
sin(2X2Xpi/4)=0
sin(3X2Xpi/4)=1
sin(4X2Xpi/4)=0
这也是经典的5点做图法。
频率为50Hz则可以生成一个文本文件并且里面的值是基于最大定时器周期的占空比的值 比如0 5000us 0 5000us 0
如果我们想生成一个spwm波
它的参数是50HZ,要分成100个离散的点
那么将A设置为你的振幅如1
将Discrete设置为101(注意根据5点法,离散的点的值即D的值设置为4N+1比如101就是4*25+1这样的形式)
将F频率设置为50
那么可以生成一个有最大占空比的一个定时器周期和两排
定时器的数上一排为正半周下一排为负半周
至于它的相位和偏距,由于用不到就没有添加,有需要的朋友可自行添加。

//本程序用于产生离散的点的正弦函数,可用于DAC
#include<stdio.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include<windows.h>
#include <stdlib.h>
#include <string.h>
#define ISFLOAT 1     //float计算开关精度要求很高时设置为1开启

int main()
{
    float F,y,tem,T,A;
#if ISFLOAT
    float tim;
#else
    unsigned int tim;
#endif
    int x,i;

    char chFloat[20];
    char YorN='y';
    float temp;
    while (YorN=='Y'||YorN=='y')
    {
    FILE *fp=fopen("value_of_time.txt","w");

    printf("请输入A(振幅)的值:");
    if(scanf("%f",&A) == 0)
    {
           printf("err!\n");
           return 0;
    }
    while(A<=0)
    {
        printf("输入的数据有误,请重新输入:");
        if(scanf("%f",&A) == 0)
            {
                printf("err!\n");
                return 0;
            }
    }
    fputs("该sin振幅的值是:",fp);
    sprintf(chFloat,"%f",A);
    fputs(chFloat,fp);

    printf("请输入要离散的点数(该值-1之后最好能被4整除):");
    if(scanf("%d",&x) == 0)
    {
           printf("err!\n");
           return 0;
    }
    while(x<=1)
    {
        printf("输入的数据有误,请重新输入:");
        if(scanf("%d",&x) == 0)
            {
                printf("err!\n");
                return 0;
            }
    }
    fputs("该sin的产生的离散的点数是:",fp);
    sprintf(chFloat,"%d",x);
    fputs(chFloat,fp);

    printf("请输入频率:");
    
    if(scanf("%f",&F) == 0)
    {
           printf("err!\n");
           return 0;
    }
    while(F<=0)
    {
        printf("输入的数据有误,请重新输入:");
        if(scanf("%f",&F) == 0)
            {
                printf("err!\n");
                return 0;
            }
    }
    fputs("该sin的频率是:",fp);
    sprintf(chFloat,"%f",F);
    fputs(chFloat,fp);
    fputs("Hz,",fp);

    T=(1000.0/F);
    fputs("周期是:",fp);
    sprintf(chFloat,"%f",T);
    fputs(chFloat,fp);
    fputs("ms,",fp);

    T=1000000.0/(F*(x-1));
    fputs("定时器的一个周期是:",fp);
    sprintf(chFloat,"%f",T);
    fputs(chFloat,fp);
    fputs("us",fp);
    fprintf(fp,"\n");

    printf("该sin的幅度是:%fa 频率是:%f 产生的离散的点数是%d 定时器的周期是:%fus\n",A,F,x,T);
    x--;
    printf("value of y:\n");
    fputs("定时器的设置为:",fp);
    fprintf(fp,"\n");
    for(i=0;i<=x;i++)
        {
            tem=i*2.0*M_PI/x;
            y=A*sin(tem);
            printf("%f ",y);
            if(i==(x/2+1))
            fprintf(fp,"\n");
            
            
#if ISFLOAT
            tim=fabs(T*y*1.0/A);
            sprintf(chFloat,"%f",tim);
#else
            temp=fabs(T*y*1.0/A);
  //          tim=ceil(temp);
            tim=(int)(temp+0.5);
            sprintf(chFloat,"%d",tim);     
#endif
            fputs(chFloat,fp);
            if(i<x)
            fputs(",",fp);
        }
        
        printf("\n");
        fclose(fp);/*关闭文件*/
        system("value_of_time.txt");
        printf("输入Y或者y继续,其他退出\n");
        scanf("%s",&YorN);
    }
    //system("exit");
}






plz input value of A:1
plz input discrete:101
plz input F:50
该sin的幅度是:1 频率是:50.000000 产生的离散的点数是101 定时器的周期是:200.000000us
value of y:
0.000000 0.062791 0.125333 0.187381 0.248690 0.309017 0.368125 0.425779 0.481754 0.535827 0.587785 0.637424 0.684547 0.728969 0.770513 0.809017 0.844328 0.876307 0.904827 0.929776 0.951057 0.968583 0.982287 0.992115 0.998027 1.000000 0.998027 0.992115 0.982287 0.968583 0.951056 0.929776 0.904827 0.876307 0.844328 0.809017 0.770513 0.728969 0.684547 0.637424 0.587785 0.535827 0.481754 0.425779 0.368125 0.309017 0.248690 0.187381 0.125333 0.062790 -0.000000 -0.062791 -0.125333 -0.187381 -0.248690 -0.309017 -0.368125 -0.425779 -0.481754 -0.535827 -0.587785 -0.637424 -0.684547 -0.728969 -0.770513 -0.809017 -0.844328 -0.876307 -0.904827 -0.929776 -0.951056 -0.968583 -0.982287 -0.992115 -0.998027 -1.000000 -0.998027 -0.992115 -0.982287 -0.968583 -0.951056 -0.929776 -0.904827 -0.876307 -0.844328 -0.809017 -0.770513 -0.728969 -0.684547 -0.637424 -0.587785 -0.535827 -0.481754 -0.425779 -0.368125 -0.309017 -0.248690 -0.187381 -0.125333 -0.062790 0.000000
输入Y或者y继续,其他退出

生成的文件名为value_of_time.txt
该sin幅度的值是:1该sin的产生的离散的点数是:101该sin的频率是:50.000000周期是:0.020000ms定时器的一个周期是:200.000000us
定时器的设置为:
0,12,25,37,49,61,73,85,96,107,117,127,136,145,154,161,168,175,180,185,190,193,196,198,199,200,199,198,196,193,190,185,180,175,168,161,154,145,136,127,117,107,96,85,73,61,49,37,25,12,0,
12,25,37,49,61,73,85,96,107,117,127,136,145,154,161,168,175,180,185,190,193,196,198,199,200,199,198,196,193,190,185,180,175,168,161,154,145,136,127,117,107,96,85,73,61,49,37,25,12,0,

将A=36,D=101,F=50输入后导入excel之后y值生成的图像
在这里插入图片描述
定时器的图像
在这里插入图片描述
可以看到仍有少量的毛刺,根据微积分的原理是会有这样的效果的所以离散的点越多那么数模转换的就越彻底,但是可以通过在中间添加电容和电感的方法来将波形变得平滑。从而达到目标交流电。

最后附一张仿真出来的图,此博客就此终结
在这里插入图片描述在这里插入图片描述

更新一波代码,有人反馈不能四舍五入。。。。。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
正弦SPWM样本表生成软件是一种用于生成正弦调制技术(SPWM)的样本表的软件工具。SPWM是一种常用的电力电子调制技术,广泛应用于电力变频器、UPS电源、可逆供电系统等领域。 这种软件的主要功能是根据用户输入的参数,生成满足需求的正弦样本表。用户可以设置输出的正弦频率、幅值和相位等参数,以便生成所需的形。软件内置了正弦函数的计算模块,通过对输入参数进行处理,可以高效地生成样本表。 生成的样本表一般采用离散的时间间隔进行采样,每个时间间隔内的采样值即为对应时间点上的正弦幅值。用户可以选择输出的样本点数,以满足系统的要求。为了保证输出的形的光滑性和精确性,软件会通过插值算法对样本点进行处理,以减小采样误差。 正弦SPWM样本表生成软件通常还具备其他加功能,比如可视化界面、数据导出、形展示等。用户可以通过界面操作直观地设置参数,并实时观察生成形效果。同时,软件还支持将生成的样本表数据导出为文件,以便后续的仿真分析或实际应用。 总之,正弦SPWM样本表生成软件是一种方便快捷的工具,可以帮助用户生成满足需求的正弦样本表。它具备灵活的参数设置、高效的计算模块和其他加功能,能够满足电力电子调制技术的应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值