03-基础例程3

基础例程3

01、外部中断

ESP32的外部中断有上升沿、下降沿、低电平、高电平触发模式。

实验目的

使用外部中断功能实现按键控制LED的亮灭

按键按下为0。【即下降沿】

 * 接线说明:按键模块-->ESP32 IO
 *         (K1-K4)-->(14,27,26,25)
 *         
 *         LED模块-->ESP32 IO
 *         (D1-D4)-->(15,2,0,4)

软件程序

  • 对于主函数
/* 深圳市普中科技有限公司(PRECHIN 普中)
   技术支持:www.prechin.net
 * 实验名称:外部中断实验
 * 接线说明:按键模块-->ESP32 IO[输入]
 *         (K1-K4)-->(14,27,26,25)
 *         
 *         LED模块-->ESP32 IO[输出]
 *         (D1-D4)-->(15,2,0,4)
 * 
 * 实验现象:程序下载成功后,操作K1键控制D1指示灯亮灭;操作K2键控制D2指示灯亮灭;
            操作K3键控制D3指示灯亮灭;操作K4键控制D4指示灯亮灭; 
 */

#include "public.h"
#include "exti.h"


//定义LED控制引脚
#define led1_pin  15
#define led2_pin  2
#define led3_pin  0
#define led4_pin  4

//定义全局变量

void setup() {
  pinMode(led1_pin, OUTPUT);//设置引脚为输出模式
  pinMode(led2_pin, OUTPUT);
  pinMode(led3_pin, OUTPUT);
  pinMode(led4_pin, OUTPUT);
  exti_init();
}

void loop() {
  digitalWrite(led1_pin,key1_sta);
  digitalWrite(led2_pin,key2_sta);
  digitalWrite(led3_pin,key3_sta);
  digitalWrite(led4_pin,key4_sta);
}

  • 对于中断函数
#include "exti.h"

volatile u8 key1_sta=0;
volatile u8 key2_sta=0;
volatile u8 key3_sta=0;
volatile u8 key4_sta=0;

//端口初始化
void exti_init(void)
{
  pinMode(key1_pin, INPUT_PULLUP);//设置引脚为输入上拉模式
  pinMode(key2_pin, INPUT_PULLUP);
  pinMode(key3_pin, INPUT_PULLUP);
  pinMode(key4_pin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(key1_pin), key1_isr, FALLING);//设置下降沿触发
  attachInterrupt(digitalPinToInterrupt(key2_pin), key2_isr, FALLING);
  attachInterrupt(digitalPinToInterrupt(key3_pin), key3_isr, FALLING);
  attachInterrupt(digitalPinToInterrupt(key4_pin), key4_isr, FALLING);
}
/*中断函数*/
void key1_isr(void)
{
  key1_sta=!key1_sta;
}

void key2_isr(void)
{
  key2_sta=!key2_sta;
}

void key3_isr(void)
{
  key3_sta=!key3_sta;
}

void key4_isr(void)
{
  key4_sta=!key4_sta;
}

02、定时器中断

使用定时器进行定时。

  • 主函数
/* 深圳市普中科技有限公司(PRECHIN 普中)
   技术支持:www.prechin.net
 * 
 * 实验名称:定时器中断实验
 * 
 * 接线说明:LED模块-->ESP32 IO
 *         (D1)-->(15)
 * 
 * 实验现象:程序下载成功后,D1指示灯间隔0.5s状态翻转
 * 
 * 注意事项:
 * 
 */

#include "public.h"
#include "led.h"
#include "time.h"


//定义全局变量


void setup() {
  led_init();
  time0_init(500000);//定时500ms
  
}

void loop() {
  
}

#include "led.h"

//led初始化
void led_init(void)
{
  pinMode(led1_pin, OUTPUT);//设置引脚为输出模式
}

  • 定时器的函数
#include "time.h"
#include "led.h"

hw_timer_t *timer0 = NULL;//创建timer0定时器对象

//定时器初始化
//per:定时时间,单位us
void time0_init(u32 per)
{
  /* timerBegin:初始化定时器指针
    第一个参数:设置定时器0(一共有四个定时器0、1、2、3)
    第二个参数:80分频(设置APB时钟,ESP32主频80MHz),80则时间单位为1Mhz即1us,1000000us即1s。
    第三个参数:计数方式,true向上计数 false向下计数
 */
  timer0 = timerBegin(0, 80, true);

  /* timerAlarmWrite:配置报警计数器保护值(就是设置时间)
     第一个参数:指向已初始化定时器的指针
     第二个参数:定时时间,这里为500000us  意思为0.5s进入一次中断
     第三个参数:是否重载,false定时器中断触发一次  true:死循环
  */
  timerAlarmWrite(timer0, per, true);

  /* timerAttachInterrupt:绑定定时器
     第一个参数:指向已初始化定时器的指针
     第二个参数:中断服务器函数
     第三个参数:true边沿触发,false电平触发
  */
  timerAttachInterrupt(timer0, &time0_isr, true); 
  timerAlarmEnable(timer0);//启用定时器
  //timerDetachInterrupt(timer0);//关闭定时器
  
}

//定时器中断函数
/*当定时时间到,进入定时器中断函数
*/
void time0_isr(void)
{
  static u8 led_sta=0; 
  led_sta=!led_sta;
  digitalWrite(led1_pin,led_sta);
}

03、PWM

实验目的

通过调节PWM占空比,控制LED指示灯亮度变化,实现呼吸灯的效果。由暗到亮,再由亮到暗的循环过程。

高电平的占空比不同,则电压不同,则LED的亮度不同

  • 主函数
/* 深圳市普中科技有限公司(PRECHIN 普中)
   技术支持:www.prechin.net 
 * 实验名称:PWM呼吸灯实验 
 * 接线说明:LED模块-->ESP32 IO
 *         (D1)-->(15)
 * 实验现象:程序下载成功后,D1指示灯呈现呼吸灯效果,由暗变亮,再由亮变暗
 */

#include "public.h"
#include "led.h"
#include "pwm.h"


//定义全局变量
u16 g_duty_value=0;
u8 g_fx=1;

void setup() {
  pwm_init(led1_pin,0,1000,10);
  
}

void loop() {
  if(g_fx==1)
  {
    g_duty_value+=10;
    if(g_duty_value>1010)g_fx=0;
  }
  else
  {
    g_duty_value-=10;
    if(g_duty_value<10)g_fx=1;
  }
  pwm_set_duty(0,g_duty_value);
  delay(10);
}

#include "led.h"

//led初始化
void led_init(void)
{
  pinMode(led1_pin, OUTPUT);//设置引脚为输出模式
}

  • PWM的函数
#include "pwm.h"

/*
PWM初始化
//pin:引脚号
//chanel:PWM输出通道0-15
//freq:PWM输出频率,单位HZ
//resolution:PWM占空比的分辨率1-16,比如设置8,分辨率范围0-255
*/
void pwm_init(u8 pin,u8 chanel,u8 freq,u8 resolution)
{
  ledcSetup(chanel, freq, resolution);// PWM初始化
  ledcAttachPin(pin, chanel);// 绑定PWM通道到GPIO上
}

//PWM占空比设置
//chanel:PWM的输出通道
//duty:占空比
void pwm_set_duty(u8 chanel,u16 duty)
{
  ledcWrite(chanel,duty);// 改变PWM的占空比
}

04、串口通信

  • 实验介绍

在ESP32中有三个硬件的UART:UART0、UART1和UART2。

03-基础例程3_第1张图片

ESP32 TX——RX

ESP32 RX——TX

GND——GND

其中UART0用于下载程序和调试

UART1:内部的通信

  • 代码
/* 深圳市普中科技有限公司(PRECHIN 普中)
   技术支持:www.prechin.net
 * 
 * 实验名称:串口通信实验
 * 
 * 接线说明:USB转TTL模块-->ESP32 IO
 *         (TXD)-->(16)
           (RXD)-->(17)
           (GND)-->(GND)
 * 
 * 实验现象:程序下载成功后,打开串口调试助手,选择好串口、波特率115200参数等,在串口助手上发送字符数据,
             ESP32串口接收后原封不动返回到串口助手显示
 * 
 * 注意事项:USB转TTL模块上将电源切换为3.3V
 * 
 */

#include "public.h"


//定义全局变量
//定义串口2
HardwareSerial mySerial2(2);
String serialData;


void setup() {
  //串口0配置
  Serial.begin(115200);
  //串口2配置
  //void HardwareSerial::begin(unsigned long baud, uint32_t config=SERIAL_8N1, int8_t rxPin=-1, int8_t txPin=-1, bool invert=false, unsigned long timeout_ms = 20000UL);
  //baud:串口波特率,该值写0则会进入自动侦测波特率程序;
  //config:串口参数,默认SERIAL_8N1为8位数据位、无校验、1位停止位;
  //rxPin:接收管脚针脚号;
  //txPin:发送管脚针脚号;
  //invert:翻转逻辑电平,串口默认高电平为1、低电平为0;
  //timeout_ms:自动侦测波特率超时时间,如果超过该时间还未获得波特率就不会使能串口;
  mySerial2.begin(115200,SERIAL_8N1,16,17);
  
}

void loop() {
  if(Serial.available())  //当串口0接收到信息后
  {
    Serial.println("Serial Data Available..."); // 通过串口监视器通知用户
    serialData=Serial.readString();  // 将接收到的信息使用readString()存储于serialData变量
    Serial.print("Received Serial Data: ");     // 然后通过串口监视器输出serialData变量内容
    Serial.println(serialData);                 // 以便查看serialData变量的信息
  }
  if(mySerial2.available())  //当串口2接收到信息后
  {
    mySerial2.println("Serial2 Data Available..."); // 通过串口监视器通知用户
    serialData=mySerial2.readString();  // 将接收到的信息使用readString()存储于serialData变量
    mySerial2.print("Received Serial2 Data: ");     // 然后通过串口监视器输出serialData变量内容
    mySerial2.println(serialData);                 // 以便查看serialData变量的信息
  }
}

05、ADC

  • 实验介绍

ADC功能在引脚32-39上可用。输入电压必须介于0-1.0V(高于1V都读为4095)

ADC采集电位器0-3.3V电压。

  • 硬件设计

03-基础例程3_第2张图片

J2端子的R_ADC脚为电位器的电压输出端,可将该引脚与ESP32的ADC脚相连接

旋转底板上的ADC电位器,即可改变电压

  • 软件设计
/* 深圳市普中科技有限公司(PRECHIN 普中)
   技术支持:www.prechin.net
 * 
 * 实验名称:ADC实验
 * 
 * 接线说明:ADC电位器-->ESP32 IO
 *         ADC-->(34)
 * 
 * 实验现象:程序下载成功后,会在软件串口控制台上输出ADC检测电压值,调节电位器可改变检测电压
 * 
 * 注意事项:
 * 
 */

#include "public.h"


//定义全局变量
float adc_vol=0;


void setup() {
  //串口0配置
  Serial.begin(115200);
  
}

void loop() {
  adc_vol=3.3*(float)analogRead(34)/4095;//读取ADC值---34引脚
  Serial.print("ADC检测电压:");
  Serial.print(adc_vol);
  Serial.println("V");
  delay(500);
}





 
 * 接线说明:ADC电位器-->ESP32 IO
 *         ADC-->(34)
 * 
 * 实验现象:程序下载成功后,会在软件串口控制台上输出ADC检测电压值,调节电位器可改变检测电压
 * 
 * 注意事项:
 * 
 */

#include "public.h"


//定义全局变量
float adc_vol=0;


void setup() {
  //串口0配置
  Serial.begin(115200);
  
}

void loop() {
  adc_vol=3.3*(float)analogRead(34)/4095;//读取ADC值---34引脚
  Serial.print("ADC检测电压:");
  Serial.print(adc_vol);
  Serial.println("V");
  delay(500);
}

你可能感兴趣的:(ESP32系列,单片机,嵌入式硬件)