Arduino - 正弦波数值的采样与应用

原创 2015年11月21日 10:34:39

嵌入式系统中许多应用中需要对正弦函数采样,得到一个范围在[0, 1]按正弦规则变化的数组。简单的例子如呼吸灯和警报声等。本文以Arduino UNO为平台总结正弦函数采样的方法及使用例子。

基本步骤为:

  • 使用for循环,定义采样间隔变量x(例如0~179°)
  • 将角度间隔(1°)转换为弧度间隔,并对正弦函数进行采样
  • 对采样值进行适当转换,缩放到我们的应用需要的取值范围之中
  • 使用上述转换后的值驱动外设
  • 适当延时以保证正弦采样正常进行

1. 正弦函数采样

Arduino通过 sin(x) 函数获取正弦函数的在弧度x点的值。如果需要按角度采样,则首先要将参数x转换成弧度,采样代码如下:

float sinVal;  
for(int x=0; x<180; x++){
    //转化角度到弧度
    sinVal = (sin(x*(3.1412/180)));
    }

2.  呼吸灯示例

将LED正极通过100Ω的限流电阻与数字引脚11连接,LED负极与Arduino I/O板的GND连接搭建简单电路。

int ledPin = 11; //定义LED引脚11
float sinVal;    //存储正弦值
int ledVal;      //存储LED亮度值

void setup() {
  pinMode(ledPin,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  for(int x=0; x<180; x++){
    //当用sin函数时转化角度单位到弧度单位
    sinVal = (sin(x*(3.1412/180)));
    ledVal = int(sinVal*255);//<span style="font-family: Arial, Helvetica, sans-serif;"> 将正弦采样值转换到合适的亮度值</span>

    analogWrite(ledPin,ledVal);
    delay(25);
    }
}

3. 报警器示例

是用一个压电扬声器的正负极分别连接Arduino的数字引脚8和GND,搭建一个简单的发声电路。代码如下:

float sinVal; //存储正弦值
int toneVal;  //存储发声频率

void setup() {
  pinMode(8,OUTPUT);
}

void loop() {
  for(int x=0; x<180; x++){
    //转化角度到弧度
    sinVal = (sin(x*(3.1412/180)));
    //用sin函数值产生声音频率
    toneVal = 2000 + (int(sinVal*1000)); // 将正弦采样值转换到合适的声音频率点
    tone(8,toneVal); //引脚8,输出频率toneVal(Hz)
    delay(2); //延时2ms,以保证正弦波以需要的速度变化
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

正弦波采样值计算程序

  • 2009年06月16日 08:45
  • 24KB
  • 下载

声音中正弦波的提取--sinusoidal model

我们对一段声音分析,可以做STFT变换,对于“音调”类声音,可能只需要数量有限的正弦信号就可以模拟及还原原始声音,也大大简化了分析。对正弦信号的分析和提取,也有助于实现音调提取,声源分离,及对某一声源...
  • qq_29276125
  • qq_29276125
  • 2016年01月11日 19:15
  • 423

Arduino + AD9851 DDS信号模块 频率控制字和相位控制字写入

如何用arduino控制AD9851,产生特定频率的正弦波或方波,并控制相位。
  • zzzw0
  • zzzw0
  • 2017年06月14日 00:09
  • 1267

Arduino 应用笔记

对采购的微型duino(pro mini ATMGEA328P 兼容ATMEGA328P ),上传不成功的问题,解决办法买好一点的CP2102,有一个DTR接口,接到duino的DTR上就可以正常上传...
  • zn845639326
  • zn845639326
  • 2017年03月14日 22:37
  • 99

方波转为正弦波的简单方案简介

将方波信号转化为正弦波信号,主要是需要抑制方波信号的谐波信号,主要是抑制三次谐波。经过仿真测试,能够将方波转化为正弦波的滤波器,其衰减必须足够陡峭,将谐波频率尽可能压掉。在实际的滤波器中,经过测试,采...
  • shiyuan0
  • shiyuan0
  • 2014年12月08日 14:36
  • 3384

Proteus之51MCU学习之路--如何用PWM波产生正弦波?

PWM产生正弦波的要点如下: 1、PWM波的频率(F_PWM)与正弦波频率(F_SIN)之间的对应关系与采样点数(S_NUM)有着密切的关系,即F_SIN=F_PWM/S_NUM; 2、PWM波如何变...
  • kelvindream
  • kelvindream
  • 2016年08月03日 12:05
  • 2333

写的一个Arduino控制超声波模块的例子

const int TrigPin = 2; const int EchoPin = 3; float distance_cm = 0; void setup() {//这个函数是初始化程序...
  • tongjinrui
  • tongjinrui
  • 2017年04月06日 14:28
  • 973

Arduino 控制步进电机的转速随时间按正弦规律变化

下面这段Arduino代码可以用的前提条件是,你用的步进电机的驱动器只需要你给定速度(脉冲时间间隔)和方向即可(推荐用这种驱动器),不需要你具体地指定A+,A-,B+,B-四根线分别是高电平还是低电平...
  • pijianzhirui
  • pijianzhirui
  • 2017年05月07日 15:59
  • 1379

stm32 DAC+DMA 输出100K正弦波杠杠的!!!

之前想用stm32的DAC输出正弦波,才用的方案是用for循环输出36的
  • znmdwahaha
  • znmdwahaha
  • 2014年07月09日 22:17
  • 7132

STM32 双DAC DMA TIM6输出正弦波例子

STM32F103有双DAC通道,利用DMA实现2个波形输出
  • mcubbs
  • mcubbs
  • 2016年12月24日 14:15
  • 1456
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Arduino - 正弦波数值的采样与应用
举报原因:
原因补充:

(最多只允许输入30个字)