Arduino使用定时器设置周期时间运行程序

1、用Arduino millis() 函数 实现一定程度上的多任务系统,可以设置不同时间的任务周期去执行对应的程序。比如需要10毫秒执行一次的程序、100毫秒执行一次的程序、1秒执行一次的程序。

2、Delay(ms)是延时函数,使用该延时函数,后面的程序将会暂停执行

millis() 多任务,代码


const long _100msTime = 100;      // 100 milli seconds
unsigned long _100msLastTime; 
const long _1000msTime = 1000;    // 1000 milli seconds
unsigned long _1000msLastTime;  
long a=0;
long b=0;
int count=0;

void setup() {
  // 打开串口
    Serial.begin(9600);
    while (!Serial) 
    {
        ; //等待串口连接。仅本机USB口使用。
    }
    Serial.println("Serial is opened.");
}

void loop() {
  // put your main code here, to run repeatedly:
  TimeProc();
}

void TimeProc()
{
  //1000ms执行一次
  if ((millis() - _1000msLastTime) >= _1000msTime)
  {
    _1000msLastTime = millis( );    

    //
    Serial.print("Counts a is: "); 
    Serial.print(a); 
    Serial.println(";");

    Serial.print("Counts b is: "); 
    Serial.print(b); 
    Serial.println(";");
    
    b++;
  } 
  //100ms执行一次
  if ((millis() - _100msLastTime) >= _100msTime)
  {
    _100msLastTime = millis( );  
     
    a++;

    /*
   //
    if(count>10)
    {
      count=0;
      a++;
    }
    count++;  
    */     
  }    
}

串口检测

3、测试控制器从开机到程序运行花费时间

代码:


const long _100msTime = 100;      // 100 milli seconds
unsigned long _100msLastTime; 
const long _1000msTime = 1000;    // 1000 milli seconds
unsigned long _1000msLastTime;  
long a=0;
long b=0;
int count=0;

unsigned long startTime; // 用于记录开始时间
unsigned long endTime;   // 用于记录结束时间

void startTimer() 
{
  startTime = millis(); // 记录开始时间
} 
void stopTimer() 
{
  endTime = millis(); // 记录结束时间
} 
unsigned long getElapsedTime() 
{
  return endTime - startTime; // 返回经过的毫秒数
}

void setup() 
{
  startTimer();
  // 打开串口
    Serial.begin(9600);
    while (!Serial) 
    {
        ; //等待串口连接。仅本机USB口使用。
    }
    Serial.println("Serial is opened.");
}

void loop() {
  // put your main code here, to run repeatedly:
  stopTimer();
  unsigned long elapsed = getElapsedTime(); // 获取经过的时间 
  Serial.print("StartTime  is: ");
  Serial.print(elapsed); 
  Serial.println(";");

  delay(2000);
  
  TimeProc();
}

void TimeProc()
{
  
     
  //1000ms执行一次
  if ((millis() - _1000msLastTime) >= _1000msTime)
  {
    _1000msLastTime = millis( );    


    //
    Serial.print("Counts a is: "); 
    Serial.print(a); 
    Serial.println(";");

    Serial.print("Counts b is: "); 
    Serial.print(b); 
    Serial.println(";");
    
    b++;
  } 
  //100ms执行一次
  if ((millis() - _100msLastTime) >= _100msTime)
  {
    _100msLastTime = millis( );  
     
    a++;

    /*
   //
    if(count>10)
    {
      count=0;
      a++;
    }
    count++;  
    */     
  }    
}

串口检测

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ESP32-C3定时器开发文档 ESP32-C3是一款低功耗、高性能的Wi-Fi和蓝牙双模SoC,它集成了多个定时器,可以用于各种应用场景,如PWM控制、定时中断、计时等。本文将介绍ESP32-C3定时器使用方法。 一、ESP32-C3定时器的类型 ESP32-C3有四种类型的定时器,分别为:通用定时器、高精度定时器、看门狗定时器、RTC定时器。 1.通用定时器 ESP32-C3有两个通用定时器,可以用于PWM控制、定时中断、计时等。这两个定时器分别为定时器0和定时器1,每个定时器有16位的自由运行计数器和一个16位的比较器。通用定时器的主要特点如下: - 可以配置为定时器或计数器 - 支持自由运行计数器和比较器 - 支持自动重载计数器 - 支持PWM输出 - 支持定时中断 2.高精度定时器 ESP32-C3有一个高精度定时器,可以用于需要高精度计时的应用场景。这个定时器是单向计时器,可以自由设置计时周期和定时中断时间。高精度定时器的主要特点如下: - 可以设置自由运行计数器的计数周期 - 可以设置定时中断时间 - 支持单向计时模式 - 支持自动重载计数器 3.看门狗定时器 ESP32-C3有一个看门狗定时器,可以用于应用程序中的异常保护。当应用程序出现异常时,看门狗定时器会自动重启系统。看门狗定时器的主要特点如下: - 可以设置看门狗定时器的计数周期 - 支持看门狗定时器中断 - 支持自动重载计数器 4.RTC定时器 ESP32-C3有一个RTC定时器,可以用于实时时钟应用。RTC定时器的主要特点如下: - 可以设置RTC计数器的计数周期 - 支持RTC定时器中断 - 支持自动重载计数器 二、ESP32-C3定时器使用步骤 1.初始化定时器使用定时器前,需要先初始化定时器。以定时器0为例,初始化代码如下: // 配置定时器0的参数 timer_config_t timer_cfg = { .divider = 16, // 定时器分频系数 .counter_dir = TIMER_COUNT_UP, // 定时器计数器方向 .counter_en = TIMER_PAUSE, // 定时器计数器是否启动 .alarm_en = TIMER_ALARM_EN, // 定时器报警是否启动 .auto_reload = TIMER_AUTORELOAD_EN, // 定时器是否自动重载 .counter_bit_width = TIMER_DATA_WIDTH_16BIT, // 定时器计数器位宽 .alarm_value = 10000, // 定时器报警值 }; // 初始化定时器0 timer_init(TIMER_GROUP_0, TIMER_0, &timer_cfg); 2.启动定时器 初始化定时器后,需要启动定时器才能开始计时。以定时器0为例,启动代码如下: timer_start(TIMER_GROUP_0, TIMER_0); 3.设置定时器中断 如果需要在定时器到达一定时间后触发中断,则需要设置定时器中断。以定时器0为例,设置中断代码如下: // 配置定时器0中断参数 timer_isr_t isr_cfg = { .func = timer0_isr, // 定时器中断处理函数 .arg = NULL, // 中断处理函数参数 }; // 注册定时器0中断 timer_isr_register(TIMER_GROUP_0, TIMER_0, &isr_cfg, NULL, 0); 4.停止定时器 如果需要停止定时器,则可以使用以下代码: timer_pause(TIMER_GROUP_0, TIMER_0); 5.重启定时器 如果定时器已经停止,则可以使用以下代码重启定时器: timer_start(TIMER_GROUP_0, TIMER_0); 6.设置定时器报警值 如果需要定时器到达一定时间后触发报警,则需要设置定时器报警值。以定时器0为例,设置报警值代码如下: timer_set_alarm_value(TIMER_GROUP_0, TIMER_0, 20000); 7.获取定时器计数器值 如果需要获取定时器的计数器值,则可以使用以下代码: uint64_t timer_value; timer_get_counter_value(TIMER_GROUP_0, TIMER_0, &timer_value); 8.清除定时器中断标志 当定时器中断被触发后,需要清除中断标志才能继续触发中断。以定时器0为例,清除中断标志代码如下: timer_group_clr_intr_status(TIMER_GROUP_0, TIMER_0); 三、ESP32-C3定时器应用示例 以下是一个使用定时器0实现PWM输出的示例代码: #include "driver/timer.h" #define LED_PIN 2 #define PWM_FREQ 1000 #define PWM_MAX_DUTY 1023 void timer0_isr(void *arg) { timer_group_clr_intr_status(TIMER_GROUP_0, TIMER_0); static uint32_t pwm_count = 0; static uint16_t pwm_duty = 0; pwm_count++; if (pwm_count >= (1000000 / PWM_FREQ)) { pwm_count = 0; pwm_duty++; if (pwm_duty > PWM_MAX_DUTY) { pwm_duty = 0; } timer_set_alarm_value(TIMER_GROUP_0, TIMER_0, (1000000 / PWM_FREQ)); timer_set_counter_value(TIMER_GROUP_0, TIMER_0, 0); ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, pwm_duty); ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0); } } void app_main() { // 初始化LED gpio_pad_select_gpio(LED_PIN); gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT); gpio_set_level(LED_PIN, 0); // 配置定时器0的参数 timer_config_t timer_cfg = { .divider = 16, // 定时器分频系数 .counter_dir = TIMER_COUNT_UP, // 定时器计数器方向 .counter_en = TIMER_PAUSE, // 定时器计数器是否启动 .alarm_en = TIMER_ALARM_EN, // 定时器报警是否启动 .auto_reload = TIMER_AUTORELOAD_EN, // 定时器是否自动重载 .counter_bit_width = TIMER_DATA_WIDTH_16BIT, // 定时器计数器位宽 .alarm_value = (1000000 / PWM_FREQ), // 定时器报警值 }; // 初始化定时器0 timer_init(TIMER_GROUP_0, TIMER_0, &timer_cfg); // 注册定时器0中断 timer_isr_t isr_cfg = { .func = timer0_isr, // 定时器中断处理函数 .arg = NULL, // 中断处理函数参数 }; timer_isr_register(TIMER_GROUP_0, TIMER_0, &isr_cfg, NULL, 0); // 设置PWM输出 ledc_timer_config_t ledc_timer_cfg = { .duty_resolution = LEDC_TIMER_10_BIT, // PWM位宽 .freq_hz = PWM_FREQ, // PWM频率 .speed_mode = LEDC_LOW_SPEED_MODE, // PWM速度模式 .timer_num = LEDC_TIMER_0, // PWM定时器号 .clk_cfg = LEDC_AUTO_CLK, // PWM时钟配置 }; ledc_timer_config(&ledc_timer_cfg); ledc_channel_config_t ledc_channel_cfg = { .channel = LEDC_CHANNEL_0, // PWM通道号 .duty = 0, // PWM占空比 .gpio_num = LED_PIN, // PWM输出引脚 .speed_mode = LEDC_LOW_SPEED_MODE, // PWM速度模式 .timer_sel = LEDC_TIMER_0, // PWM定时器号 }; ledc_channel_config(&ledc_channel_cfg); ledc_fade_func_install(0); // 启动定时器0 timer_start(TIMER_GROUP_0, TIMER_0); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Big_潘大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值