4.1.1 实验内容

本实验为利用PWM方式实现呼吸灯的实验现象,呼吸灯即灯的亮度在一个范围内明暗变化,是一个动态的过程。 这部分介绍两个新的函数,分别为analogWrite()和analogRead(),本实验中应用到analogWrite()函数,该函数有两个参数analogWrite(pin, value),分别为所需要设定的引脚和引脚输出的模拟量大小,输出电压范围为0V-5V,映射到0-255范围内,则每变化1代表电压变化0.02V。其作用是给端口写入一个值(占空比),可以用来控制LED灯的亮度变化。当执行analogWrite()命令后,端口会输出一个稳定的占空比的方波。除非有下一个命令来改变它。PWM信号的频率大约为490Hz。 analogWrite()命令只能工作于9,10,11号端口。在使用analogWrite()命令前,可以不使用pinMode()命令把端口定义为输出端口,当然如果定义了更好,这样利于程序语言规范。 为实现呼吸灯的实验现象有多种方法,最基本简单的一种是用到一个for循环,设置参数a在0-255之间变化,只用analogWrite(pin,a)控制输出即可。

PWM(Pulse-width modulation)脉宽调制

PWM不是真正的模拟信号,而是用数字信号的变化来类比模拟信号。使用数字控制产生占空比不同的方波(一个不停在开与关之间切换的信号)来控制不同电压输出。在本次实验中,端口的输出电压只有0V和5V,要想实现在0V-5V之间的电压就要用到PWM。打个比方来说,PcDuino的电压输出只有LOW(0V)和HIGH(5V),比作0和1,那么如果输出为01010101交替,则输出就近似为2.5V了。所以,就是用0和1输出的比例来近似不同的输出电压。单位时间内输出的0和1越多,控制就越精确。

上图中,绿线之间代表一个周期,其值也是PWM频率的倒数。换句话说,如果arduino PWM的频率是500Hz,那么两绿线之间的周期就是2毫秒。analogWrite() 命令中可以操控的范围为0-255,analogWrite(255)表示100%占空比(常开), analogWrite(127)占空比大约为50%(一半的时间)。

4.1.2 实验步骤

  1. 将LED的两个管脚分别连接GPIO9和GND;
  2. 打开Arduino IDE,新建项目,编写代码(以下为参考代码,实际可以实现本实验现象的方式有很多);
  3. 编译并上传到PcDuino开发板中,观察实验现象。

4.1.3 代码及相关分析

代码一版:

#include <core.h>
int led = 9;

void setup() {                
  pinMode(led, OUTPUT);    // 初始化led为输出模式
}

void loop() {
  for( int i = 0 ; i < 255 ; i++)
  {
  analogWrite(led, i);
  delay(10);
  }

}

这段代码为简单的实现呼吸灯的方法,下一版本为使实现结果更清晰,输出value值。

进阶版本:

/*
* PWM test program
*/
#include <core.h>
int pwm_id = 9;
int delay_us = 200000;
int freq = 781; //Hz
int value = 0;

void setup() {
  int step = 0;

  step = pwmfreq_set(pwm_id, freq);
  printf("PWM%d set freq %d and valid duty cycle range [0, %d]\n",pwm_id, freq, step);
  if(step > 0){
    printf("PWM%d test with duty cycle %d\n",pwm_id, value);
    analogWrite(pwm_id,value);
  }

}
void loop() {
  while(1)
  {
    value +=5;
    if(MAX_PWM_LEVEL < value)value = 0;
    delayMicroseconds(delay_us);
    printf("PWM%d test with duty cycle %d\n", pwm_id, value);
    analogWrite(pwm_id, value);
  }

}

4.1.4 实验结果

实验结果如上图所示,显示的数据为0V-5V电压映射到0-255区间后的结果,因为呼吸灯现象用图片很难分辨亮的强弱,此处不贴实际效果图。

results matching ""

    No results matching ""