1.ADC的使用
把模拟量转换为数字量的一个过程
ADC是12位,因此读到的数值为0-4096
1.先设置该引脚为输出
pinMode(num,INPUT); //设置为num引脚输入
2.读入该引脚的数值
ADC为12位,因此读的值大小为0-4096
x = analogRead(num); //读14引脚的值读取范围0-4096,即采样值
使用x接受读到的ADC值
3.代码演示
读取GPIO14,对应ADC2_CH6,然后通过串口监视器打印出来
// ADC为12位
const int num = 14; //设置引脚14 对于ADC为 ADC2_CH6
int x = 0;
void setup() {
Serial.begin(115200); //设置波特率
pinMode(num,INPUT); //设置为14引脚输入
}
void loop() {
x = analogRead(num); //读14引脚的值读取范围0-4096,即采样值
Serial.println(x); //打印ADC的值
delay(500);
}
2.DAC的使用
将数字量转换成模拟量的一个过程
DAC | 引脚 |
DAC1 | (GPIO25) |
DAC2 | (GPIO26) |
DAC是8位,因此读到的数值为0-255,引脚输出的最大电压3.3V
1.定义25号引脚为输出(定义引脚25为DAC1)
#define DAC1 25 //定义引脚25为DAC1
pinMode(DAC1,OUTPUT); //设置为25引脚输出
2.使用函数dacWrite()输出电压
dacWrite(DAC1,x); //引脚输出150 150/255 = y/3.3 y即为输出电压
dacWrite(DACx,X); 第一个参数是引脚号,仅限于DAC1与DAC2,第二个参数是DAC输出的值范围0-255,输出0及电压0V,输出255及输出电压3.3V
3.代码演示
#define DAC1 25 //定义引脚25为DAC1
int x = 0;
void setup() {
pinMode(DAC1,OUTPUT); //设置为25引脚输出
}
void loop() {
for(x=0;x<=255;x++)
{
dacWrite(DAC1,x); //引脚输出150 150/255 = y/3.3 y即为输出电压
delay(500);
}
}
4.map函数的使用
map(x,x0,y0,x1,y1); 把x进行映射,按照x0-y0与x1到y1进行映射
下面代码即把x从0-10,映射到0-50,就是说把x扩大5倍
当x = 0 X = 0; x = 1 X=5; x = 2 X = 10;
int X=0;
void setup() {
Serial.begin(9600);
}
void loop() {
for(int x=0;x<=10;x++)
{
X = map(x,0,10,0,50);
delay(500);
Serial.println(X);
}
}
应用就是ADC与DAC的转化
例如把读取到的ADC值返回给DAC输出。ADC的范围是0-4096,而DAC输出的范围是0-255;
因此使用map(x,0,4096,0,255)把X等比列的转化为0-255范围内
3.PWM的使用
pwm是Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。
PWM有高速模式和低速模型两种。从0到15共有16个通道,所有带有输出的引脚都可以输出PWM。高速通道(0 ~ 7)由80MHz时钟驱动,低速通道(8 ~ 15)由 1MHz 时钟驱动。
1.定时器配置,指定PWM信号的频率和占空比分辨率。
ledcSetup(Channel, freq, resolution);
参数 | 作用 |
Channel 通道 | 通道号0-15 |
freq 频率 | 希望得到的频率(高速的不要超过80MHz低速不要超过1MHz) |
resolution 分辨率 | 计数位数,取值0 ~ 20 |
resolution 分辨率 :(该值决定后面 ledcWrite 方法中占空比可写值,该值写8,则占空比最大可写255,该值写10,则占空比最大可写1023,值写成12,则占空比最大4095。
double ledcSetup(uint8_t channel, double freq, uint8_t resolution_bits)
该函数的返回值为最终频率ledcSetup()
2.通道配置,绑定定时器和输出PWM信号的GPIO。
ledcAttachPin(Pin, Channel);
将指定的 LEDC 通道绑定到指定的 IO 口上以实现PWM的输出。
3.改变PWM信号输出PWM信号
ledcWrite(Channel, Value); 指定的 PWM通道的输出占空比
// GPIO_13 输出PWM
// GPIO_12 读取IO14输出的信号
void setup()
{
Serial.begin(115200);
Serial.println();
ledcSetup(0, 1000, 8); //设置LEDC通道0频率为1KHz,分辨率为10位,即占空比可选0~255
ledcAttachPin(26, 0); //设置LEDC通道8在IO26上输出
pinMode(25, INPUT_PULLDOWN); //引脚25,下拉输入
}
void loop()
{
for (int i = 0; i <= 20; i++)
{
ledcWrite(0, 10 * i); //设置输出PWM
delay(500);
Serial.println(analogRead(25)); //读取引脚25的电平并输出
}
for (int i = 20; i >=0 ; i--)
{
ledcWrite(0, 10 * i); //设置输出PWM
delay(500);
Serial.println(analogRead(25)); //读取引脚25的电平并输出
}
}