K210 Getting Started-Bare Metal Development (6) Temporizador pwm

Placa de desarrollo: K210 AIRV R3 versión widora

Entorno de desarrollo: kendryte IDE official

Documentos de referencia necesarios: Guía de programación del SDK independiente v0.5.0 y esquema de Widora

(1) Cree una nueva carpeta 06my_code_pwm

Regalo + tierra

Ejemplo -> ingrese pwm -> seleccione la versión de desarrollo -> luego descargue a la carpeta justo ahora

Dependencias de instalación

Limpiar + construir

La configuración del entorno está completa, comencemos a modificar el código.

(2) Modificar el código

PWM está en el Capítulo 20

También hay ejemplos

Se definen dos macrodefiniciones para facilitar futuros trasplantes

El código se modifica de la siguiente manera

Hablemos de PWM

Los tipos de parámetros son los siguientes

De manera similar, para facilitar el trasplante, primero haga una definición macro

El código de inicialización es el siguiente

Configurar el ciclo de trabajo establecido de PWM

Habilite la salida PWM y finalmente encienda el interruptor de interrupción maestro

Función de servicio de interrupción del temporizador, la rutina aquí es la luz de respiración (oscura-> brillante-> oscura-> brillante), buena, no es necesario cambiar

(3) ¿Dónde está la lámpara? Encuentra la lámpara

Haga clic en la administración de dispositivos y descubrió que realmente configuró TIMER1

El dispositivo temporizador que usamos 0, cámbielo a LED para que corresponda con IO17,18

Pero solo configuramos el canal 0 para que solo haya 1 salida de luz, luego configuramos una luz, guarde

Limpiar + construir + descargar todo en uno

(4) Efecto 

¿La luz está encendida, pero parece que no hay efecto de respiración?

 

(5) Problemas encontrados

Cambié el PWM al canal 1 durante más de media hora antes de recordar el contenido escrito en la hoja de datos.

 

Cambiar la configuración al canal 2

Ir de una sola parada

efecto 

Hay una luz que respira

 

El aprendizaje del temporizador PWM está completo, nos vemos la próxima vez

 

Código

#include <fpioa.h>
#include <plic.h>
#include <pwm.h>
#include <stdio.h>
#include <sysctl.h>
#include <syslog.h>
#include <timer.h>

#define TIMER_DEVICE TIMER_DEVICE_0
#define TIMER_DEVICE_CH TIMER_CHANNEL_0

#define TIMER_PWM PWM_DEVICE_0
#define TIMER_PWM_CHN PWM_CHANNEL_1

int timer_callback(void *ctx) {
  static double cnt = 0.1;
  static int flag = 0;

  // 重新赋值PWM输出频率以及占空比
  pwm_set_frequency(TIMER_PWM, TIMER_PWM_CHN, 200000, cnt);

  // 三目运算,构成呼吸灯
  flag ? (cnt -= 0.01) : (cnt += 0.01);

  //越界判断
  if (cnt > 1.0) {
    cnt = 1.0;
    flag = 1;
  } else if (cnt < 0.0) {
    cnt = 0.0;
    flag = 0;
  }
}

int main(void) {
  /* Init Platform-Level Interrupt Controller(PLIC) */
  plic_init();  // 初始化中断
  /* Init timer */
  timer_init(TIMER_DEVICE);  //初始化定时器

  /* Set timer interval to 10ms (1e7ns) */
  // 配置定时器时间
  timer_set_interval(TIMER_DEVICE, TIMER_DEVICE_CH, 1e7);

  /* Set timer callback function with repeat method */
  // 绑定下中断回调函数(不带形参)
  timer_irq_register(TIMER_DEVICE, TIMER_DEVICE_CH, 0, 1, timer_callback, NULL);

  // 定时器0, 通道0,定时器回调函数,优先级
  // //上一节学的定时器,可以替代上面的注册函数吧 timer_set_irq(TIMER_DEVICE,
  // TIMER_DEVICE_CH, timer_callback, 1);

  /* Enable timer */
  //使能定时器
  timer_set_enable(TIMER_DEVICE, TIMER_DEVICE_CH, 1);

  /* Init PWM */
  // 初始化PWM
  pwm_init(TIMER_PWM);
  /* Set PWM to 200000Hz */
  // 设置PWM的频率 以及占空比
  pwm_set_frequency(TIMER_PWM, TIMER_PWM_CHN, 200000, 0.5);
  /* Enable PWM */
  // 启动产生PWM
  pwm_set_enable(TIMER_PWM, TIMER_PWM_CHN, 1);

  /* Enable global interrupt for machine mode of RISC-V */
  sysctl_enable_irq();  // 开中断
  while (1)
    ;
}

 

Supongo que te gusta

Origin blog.csdn.net/jwdeng1995/article/details/108033986
Recomendado
Clasificación