pku-电子系统基础训练-Arduino制作信号发生器

//1Hz正弦波发生器
//采用DDS方法产生波形:将一个完整正弦波离散化为512个数据,存储为数组,以一个固定频率顺序读取数组的值,即可复制波形,通过改变读取的步进量,改变输出波形频率
//采用PWM进行模拟输出,约2ms的模拟转换时间,当采用频率步长为1时,一个完整波形需要512个数据,刚好是1s左右,即1Hz

#include "waveData.h"
#include "TM1637.h"
unsigned int signalOutPWM = 5;                  //信号输出端口
#define clk 3
#define dio 4
TM1637 tm16337(clk, dio);
int8_t displayData[4] = {0x01, 0x00, 0x00, 0x00};
unsigned int delaytime = 1950;                  //每个数据由970Hz的PWM波形滤波产生,约1.9ms延迟+其他语句延迟 约等于 2ms,足以产生两个完整PWM波形
unsigned int wholePeriodNum = 512;
unsigned int i, freqStep;
unsigned int keyport = 2;
unsigned int keyport2 = 8;     
double m = 1;
void setup() {  
  pinMode(signalOutPWM, OUTPUT);
  pinMode(keyport, INPUT_PULLUP);
  pinMode(keyport2, INPUT_PULLUP);
  tm1637.set();
  tm1637.init();
  freqStep = 1;          //  
}

void loop() {
  unsigned int value = digitalRead(keyport);
  if(value==LOW)
  {
    delay(20);
    value = digitalRead(keyport);
    if(value==LOW)
    {
      freqStep++;
    freqStep = freqStep % 20;
    displayData[1] = freqStep / 10;
    displayData[2] = freqStep % 10;
    delay(1000);
    }
    
  }
  unsigned int value2 = digitalRead(keyport2);
  if(value2==LOW)
  {
    delay(20);
    value2 = digitalRead(keyport2);
    if(value2==LOW)
    {
      m += 0.25;
      if(m == 1.25) 
      {
        m -= 1;
      }
      displayData[3] = m / 0.25;
      delay(1000);
    }
    
  }
  i %= wholePeriodNum;
  analogWrite(signalOutPWM, m * sinData[i]);
  tm1637.display(displayData);
  i += freqStep;
  delayMicroseconds(delaytime);
}

// 头文件及相关说明老师会提及,但是这一部分代码需要自己写
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值