版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
//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);
}
// 头文件及相关说明老师会提及,但是这一部分代码需要自己写