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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44489823/article/details/102704351
//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);
}

// 头文件及相关说明老师会提及,但是这一部分代码需要自己写

猜你喜欢

转载自blog.csdn.net/weixin_44489823/article/details/102704351
今日推荐