C语言波形实现三角波和正弦波

方波

方波波形类似高低电平,所以设置合适的延时时间和高低电平值即可实现方波。

正弦波

#include "math.h"

#define PI       3.141592653

float WaveMin    = 1.0f;     // 波形最小峰值
float WaveMax    = 5.0f;     // 波形最大峰值

float Amplitude  = 1.0f;     // 幅值
float PeriodSin  = 100.0f;   // 正弦波周期
float Horizontal = 0.0f;     // 水平位移
float Vertical   = 0.0f;     // 垂直位移

// y = A * sin( w * x + h ) + v 
//   = A * sin( 2 * PI / T * x + h ) + v
float sin_wave( void )
{
    static float TimeCnt = 0;

    Amplitude = ( ( WaveMin + WaveMax ) / 2.0f - WaveMin );
    Vertical  = ( WaveMin + WaveMax ) / 2.0f; 

    float SinData = Amplitude * sin( 2 * PI / Period * TimeCnt + Horizontal ) + Vertical;
    TimeCnt++;

    return SinData;
}

三角波

#define False           0
#define True            1

float WaveMin    = 1.0f;     // 波形最小峰值
float WaveMax    = 5.0f;     // 波形最大峰值

float Step           = 10.0f;   // 每周期递增步长
float PeriodTriangle = 100.0f;  // 三角波周期
float WaveStart      = 1.0f;    // 波形开始值
float WaveStop       = 5.0f;    // 波形结束值
float WaveCurrent    = 0.0f;    // 当前波形值

float triangle_wave( void )
{
    static uint16_t TimeCnt = 0;
    static uint8_t  flag    = False;

    // 波形递增
    if( WaveCurrent < WaveStart && flag == False )
    {
        if( ++TimeCnt < PeriodTriangle )
        {
            WaveCurrent = WaveStart;
        }
        else
        {
            TimeCnt = 0;

            WaveCurrent += Step;
            WaveStart = WaveCurrent;
        }
    }
    // 波形递减
    else
    {
        flag = True;

        if( ++TimeCnt < PeriodTriangle )
        {
            WaveCurrent = WaveStop;
        }
        else
        {
            TimeCnt = 0;

            WaveCurrent -= Step;
            WaveStop = WaveCurrent;
        }

        if( WaveCurrent < WaveMin )
        {
            flag = False;
            WaveStart = WaveMax;
            WaveStop = WaveMin;
        }
    }

    return WaveCurrent;
}
  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奶油芝士汉堡包

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值