太幸福了啊 呵呵
Analog I/O 学习笔记
今天我学习如何操作Analog函数;学会如何用AD模块读到电压数据,如何用PWM驱动LED。
学习结束后将做一个实验程序,把AD数据通过虚拟串口发送到上位机,并用PWM做一个呼吸灯。
analogReference(type) 设置参考电压,作为模拟输入的参考
可以设的选项有:
DEFAULT(0): 5V或3.3V,视乎你的板的电压是多少,Sakura这块板是3.3V的
INTERNAL(1): 内置电压,Sakura板为1.1V
INTERNAL1V1: 内置电压,Sakura板无此选项
INTERNAL2V56: 内置电压,Sakura板无此选项
EXTERNAL(2): 连接于AREF pin 的外部参考电压(0 - 5V )
参数:
type,可用DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, EXTERNAL
返回:
无
例:analogReference(INTERNAL) //设定参考电压为内置电压1.1V 注意: 改变参考电压后,analogRead()读出来的前几个数可能是不正确的,绝对不能在AREF使用低于0V或高于5V的参考电压,如果连接了外部参考电压,在使用analogRead()前必须先设置外部参考EXTERNAL,否则内部输出的参考电压会与AREF短路,可能损坏你板上的MCU。 除此之外,你可以在外部电压和AREF之间连一个5K的电阻,这样可以避免内部和外部电压短路,但你要注意,电阻会改变电压,内部有一个电阻连接到AREF上的,具体参考你的板,举个例:如果内部电阻为32K,你连接的外部电压为2.5V,则可以计算出VREF pin上的电压为2.5 * 32 / (32 + 5) = ~2.2V analogRead() 读指定pin上的模拟数值 在sakura板的说明上可以看到到有AN0-AN7(0-7可指定,14-21也可指定,也会读取AN0-AN7,指定其它的话,会返回0)这八个通道,RX62N为10 bit的ADC,RX63N为12 bit的ADC 示例: analogRead(0); 读AN0通道 analogRead(1); 读AN1通道 analogRead(14); 读AN0通道 analogRead(15); 读AN1通道 analogWrite() 此功能可输出PMW方波到指定PIN,可用于驱动LED的亮度和马达,PWM频率大约为490Hz 参数: Pin:要输出方波的pin Value:8位数值,设定占空比,0-255 示例: analogWrite(PIN_LED0, 100); analogWrite(PIN_LED1, 200); analogWriteDAC(int dac_portnum,int val10bit); RX62N /63N的100脚,内置一个可以使用的DAC通道,可用于播放音乐哦 参数: dac_portnum,int:100 val10bit:10位数值 示例: analogWriteDAC(100,700); analogWriteFrequency(int Hz);
PWM频率设定函数(12~184999Hz) 下面是读AD数据及呼吸灯实验程序的代码: /*GR-SAKURA-SA Sketch Template Version: E0.50*/
#include <rxduino.h>
#include <r_smartanalog.h>
#define D_INTERVAL 200
int gAdval1, gAdval2; //use to save AD value
int gPwmva; //PWM value use for control led brightness
int LoopCnt; //loop cont
bool Direction; //use for control led brightness
void setup()
{
// LED setting
pinMode( PIN_LED0, OUTPUT );
pinMode( PIN_LED1, OUTPUT );
pinMode( PIN_LED2, OUTPUT );
pinMode( PIN_LED3, OUTPUT );
// Set Baudrate as 9600bps
Serial.begin( 9600 );
//Set Reference as 1.1V
analogReference(1);
//set default pwm value
gPwmva=1;
analogWrite(PIN_LED0, gPwmva);
analogWrite(PIN_LED1, gPwmva);
analogWrite(PIN_LED2, gPwmva);
analogWrite(PIN_LED3, gPwmva);
Direction=1;
}
void loop()
{
LoopCnt++;
if(LoopCnt>20)
{
// Read A/D value
gAdval1 = analogRead( 0 );
gAdval2 = analogRead( 1);
// Send A/D value via the serial
Serial.print( "A/D 0,1 = " );
Serial.print( gAdval1 );
Serial.print( ", " );
Serial.print( gAdval2 );
Serial.println( " " );
LoopCnt=0;
}
// Drive LED0
analogWrite(PIN_LED0, gPwmva);
analogWrite(PIN_LED1, gPwmva);
analogWrite(PIN_LED2, gPwmva);
analogWrite(PIN_LED3, gPwmva);
delay( D_INTERVAL );
if(Direction==1)
{
gPwmva+=20;
if(gPwmva>200)
{
Direction=0;
}
}
else
{
gPwmva-=20;
if(gPwmva<40)
{
Direction=1;
}
}
}
下面是呼吸灯的效果
下面的AD读数据的效果
例:analogReference(INTERNAL) //设定参考电压为内置电压1.1V 注意: 改变参考电压后,analogRead()读出来的前几个数可能是不正确的,绝对不能在AREF使用低于0V或高于5V的参考电压,如果连接了外部参考电压,在使用analogRead()前必须先设置外部参考EXTERNAL,否则内部输出的参考电压会与AREF短路,可能损坏你板上的MCU。 除此之外,你可以在外部电压和AREF之间连一个5K的电阻,这样可以避免内部和外部电压短路,但你要注意,电阻会改变电压,内部有一个电阻连接到AREF上的,具体参考你的板,举个例:如果内部电阻为32K,你连接的外部电压为2.5V,则可以计算出VREF pin上的电压为2.5 * 32 / (32 + 5) = ~2.2V analogRead() 读指定pin上的模拟数值 在sakura板的说明上可以看到到有AN0-AN7(0-7可指定,14-21也可指定,也会读取AN0-AN7,指定其它的话,会返回0)这八个通道,RX62N为10 bit的ADC,RX63N为12 bit的ADC 示例: analogRead(0); 读AN0通道 analogRead(1); 读AN1通道 analogRead(14); 读AN0通道 analogRead(15); 读AN1通道 analogWrite() 此功能可输出PMW方波到指定PIN,可用于驱动LED的亮度和马达,PWM频率大约为490Hz 参数: Pin:要输出方波的pin Value:8位数值,设定占空比,0-255 示例: analogWrite(PIN_LED0, 100); analogWrite(PIN_LED1, 200); analogWriteDAC(int dac_portnum,int val10bit); RX62N /63N的100脚,内置一个可以使用的DAC通道,可用于播放音乐哦 参数: dac_portnum,int:100 val10bit:10位数值 示例: analogWriteDAC(100,700); analogWriteFrequency(int Hz);
PWM频率设定函数(12~184999Hz) 下面是读AD数据及呼吸灯实验程序的代码: /*GR-SAKURA-SA Sketch Template Version: E0.50*/
#include <rxduino.h>
#include <r_smartanalog.h>
#define D_INTERVAL 200
int gAdval1, gAdval2; //use to save AD value
int gPwmva; //PWM value use for control led brightness
int LoopCnt; //loop cont
bool Direction; //use for control led brightness
void setup()
{
// LED setting
pinMode( PIN_LED0, OUTPUT );
pinMode( PIN_LED1, OUTPUT );
pinMode( PIN_LED2, OUTPUT );
pinMode( PIN_LED3, OUTPUT );
// Set Baudrate as 9600bps
Serial.begin( 9600 );
//Set Reference as 1.1V
analogReference(1);
//set default pwm value
gPwmva=1;
analogWrite(PIN_LED0, gPwmva);
analogWrite(PIN_LED1, gPwmva);
analogWrite(PIN_LED2, gPwmva);
analogWrite(PIN_LED3, gPwmva);
Direction=1;
}
void loop()
{
LoopCnt++;
if(LoopCnt>20)
{
// Read A/D value
gAdval1 = analogRead( 0 );
gAdval2 = analogRead( 1);
// Send A/D value via the serial
Serial.print( "A/D 0,1 = " );
Serial.print( gAdval1 );
Serial.print( ", " );
Serial.print( gAdval2 );
Serial.println( " " );
LoopCnt=0;
}
// Drive LED0
analogWrite(PIN_LED0, gPwmva);
analogWrite(PIN_LED1, gPwmva);
analogWrite(PIN_LED2, gPwmva);
analogWrite(PIN_LED3, gPwmva);
delay( D_INTERVAL );
if(Direction==1)
{
gPwmva+=20;
if(gPwmva>200)
{
Direction=0;
}
}
else
{
gPwmva-=20;
if(gPwmva<40)
{
Direction=1;
}
}
}
下面是呼吸灯的效果
下面的AD读数据的效果
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |