通用LED闪烁代码模块(也可实现软件PWM)

2023-05-16

 仅提供参考文件:

1、需要修改gpio引脚

2、需要根据平台实现软件定时器接口,启动,停止,回调,三个API。

3、根据平台优化相关错误即可

/*
 * pwm_drv.c
 *
 *  Created on: 2021年3月3日
 *      Author: Administrator
 */
#include "pwm_drv.h"
#include "appled.h"


enum {
  PWM_LED = 0x00,
  PWM_CHANNELS = 0x01
};


UserPwm_t userPwm[PWM_CHANNELS];

//定时器定义
EmberEventControl emberAfPluginBulbPwmDriverBlinkEventControl;


enum {

  PWM_OUTPUT_ON            = 0x00,
  PWM_OUTPUT_OFF           = 0x01,
  PWM_BLINKING_ON       = 0x02,
  PWM_BLINKING_OFF      = 0x03,
  PWM_BLINK_PATTERN     = 0x04,

};



static void pwmOutputOn(uint16_t time, UserPwm_t *p)
{
  p->turnOn();
  p->state = PWM_OUTPUT_ON;

  if (time > 0) {
    emberEventControlSetDelayMS(*(p->eventControl),
                                ((uint32_t) time) * SECONDS_TO_MILLISECONDS);
  } else {
    emberEventControlSetInactive(*(p->eventControl));
  }
}

static void pwmOutputOff(uint16_t time, UserPwm_t *p)
{
  p->turnOff();
  p->state = PWM_OUTPUT_OFF;

  if (time > 0) {
    emberEventControlSetDelayMS(*(p->eventControl),
                                ((uint32_t) time) * SECONDS_TO_MILLISECONDS);
  } else {
    emberEventControlSetInactive(*(p->eventControl));
  }
}

static void pwmBlink(uint16_t count, uint16_t blinkTime, UserPwm_t *p)
{
  p->blinkTime = blinkTime;

  p->turnOff();
  p->state = PWM_BLINKING_OFF;
  emberEventControlSetDelayMS(*(p->eventControl),
                              p->blinkTime);
  p->count = count;
}


static void pwmTurnHigh(void)
{

	HalSetledOnOff(BSP_LED1_PORT,BSP_LED1_PIN,true);

}

static void pwmTurnLow(void)
{
	HalSetledOnOff(BSP_LED1_PORT,BSP_LED1_PIN,false);
}


static void pwmRunStop(void)
{

}


static void pwmRunStart(void)
{

}


// For example, if we wished to create an SOS pattern, we would
// program the following array:
// pattern[20] = {500, 100, 500, 100, 500, 100, 100, 100, 100, 100, 100, 100,
//                500, 100, 500, 100, 500, 100};
// Where the gpio would be on in a sequences of 500 and 100 mS intervals, and
// the gpio would be off for 100 mS in between the on intervals.
static void pwmRunPattern(uint16_t    count,
                         uint16_t    length,
                         uint16_t   *pattern,
                         UserPwm_t *p)
{
  uint16_t i;

  if (length < 2) {
    return;
  }

  p->turnOn();

  p->state = PWM_BLINK_PATTERN;

  if (length > PWM_PATTERN_MAX_LENGTH) {
    length = PWM_PATTERN_MAX_LENGTH;
  }

  p->patternLength = length;
  p->count = count;

  for (i = 0; i < p->patternLength; i++) {
    p->pattern[i] = pattern[i];
  }

  emberEventControlSetDelayMS(*(p->eventControl),
                              p->pattern[0]);

  p->patternIndex = 1;
}




void pwmeventHandler(UserPwm_t *p)
{
  emberEventControlSetInactive(*(p->eventControl));
  switch (p->state) {
    case PWM_OUTPUT_ON:
      p->turnOff();
      p->stop();
      break;

    case PWM_OUTPUT_OFF:
      p->turnOn();
      p->stop();
      break;

    case PWM_BLINKING_ON:
      p->turnOff();
      if (p->count == 0) {
        p->state = PWM_OUTPUT_OFF;
        p->stop();

        break;
      }

      if (p->count != PWM_DRIVER_RUN_FOREVER) {
        p->count--;
      }
      if (p->count > 0) {
        p->state = PWM_BLINKING_OFF;
        emberEventControlSetDelayMS(*(p->eventControl),
                                    p->blinkTime);
      } else {
        p->state = PWM_OUTPUT_OFF;
        p->stop();
      }

      break;
    case PWM_BLINKING_OFF:
      p->turnOn();
      p->state = PWM_BLINKING_ON;
      emberEventControlSetDelayMS(*(p->eventControl),
                                  p->blinkTime);
      break;


    case PWM_BLINK_PATTERN:
      if (p->count == 0) {
        p->turnOff();

        p->state = PWM_OUTPUT_OFF;
        p->stop();

        break;
      }

      if (p->patternIndex % 2 == 1) {
        p->turnOff();
      } else {
        p->turnOn();
      }

      emberEventControlSetDelayMS(*(p->eventControl),
                                  p->pattern[p->patternIndex]);

      p->patternIndex++;

      if (p->patternIndex >= p->patternLength) {
        p->patternIndex = 0;

        if (p->count != PWM_DRIVER_RUN_FOREVER) {
          p->count--;
        }
      }
      break;
    default:
      break;
  }
}



void PwmDriverRunPattern(uint16_t  count,
                                     uint16_t  length,
                                     uint16_t *pattern)
{
  pwmRunPattern(count, length, pattern, &(userPwm[PWM_LED]));
}

void PwmDriverBlink(uint16_t count, uint16_t blinkTime)
{
   pwmBlink(count, blinkTime, &(userPwm[PWM_LED]));
}

void PwmDriverOutputOn(uint16_t time)
{
	pwmOutputOn(time, &(userPwm[PWM_LED]));
}


void PwmDriverOutputOff(uint16_t time)
{
	pwmOutputOff(time, &(userPwm[PWM_LED]));
}



// ******** APIs and Event Functions *************
void emberAfPluginBulbPwmDriverBlinkEventHandler(void)
{
  pwmeventHandler(&(userPwm[PWM_LED]));
}



void PwmDriverInit(void)
{
  userPwm[PWM_LED].turnOn  = pwmTurnHigh;
  userPwm[PWM_LED].turnOff = pwmTurnLow;
  userPwm[PWM_LED].start   = pwmRunStart;
  userPwm[PWM_LED].stop    = pwmRunStop;
  userPwm[PWM_LED].eventControl = &(emberAfPluginBulbPwmDriverBlinkEventControl);

}


// sequence   on -> off ->on -> off ->...

void testpwm(void)
{
	  PwmDriverInit();

	  uint16_t pattern[18] = {500, 100, 500, 100, 500, 100, 100, 100, 100, 100, 100, 100,500, 100, 500, 100, 500, 100};
	  PwmDriverRunPattern(2,sizeof(pattern),pattern);

	  //PwmDriverBlink(10,500);

	  //PwmDriverOutputOff(2000);

	  //PwmDriverOutputOn(2000);
}

/*
 * pwm_drv.h
 *
 *  Created on: 2021年3月3日
 *      Author: Administrator
 */

#ifndef EXTERNAL_COPIED_FILES_PWM_DRV_H_
#define EXTERNAL_COPIED_FILES_PWM_DRV_H_

#include <stdio.h>
#include "app/framework/include/af.h"



#define  SECONDS_TO_MILLISECONDS   (1)
#define  PWM_PATTERN_MAX_LENGTH    (20)
#define  PWM_DRIVER_RUN_FOREVER    (0xffff)

typedef struct {
  uint8_t state;
  uint16_t count;
  uint16_t blinkTime;

  uint16_t pattern[PWM_PATTERN_MAX_LENGTH];
  uint16_t patternLength;
  uint16_t patternIndex;

  void (*turnOn)(void);
  void (*turnOff)(void);
  void (*start)(void);
  void (*stop)(void);

  EmberEventControl *eventControl;
} UserPwm_t;


void PwmDriverInit(void);
void PwmDriverRunPattern(uint16_t  count,
						 uint16_t  length,
                         uint16_t *pattern);
void PwmDriverBlink(uint16_t count, uint16_t blinkTime);

void PwmDriverOutputOn(uint16_t time);

void PwmDriverOutputOff(uint16_t time);


void testpwm(void);

#endif /* EXTERNAL_COPIED_FILES_PWM_DRV_H_ */

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通用LED闪烁代码模块(也可实现软件PWM) 的相关文章

  • STM32CubeIDE---HAL库PWM使用速记

    一 如何计算 理论分析 xff1a HAL库函数之呼吸灯 PWM波 简书 jianshu com 预分频系数 PSC 自动重装载值 ARR 捕获 比较寄存器值 CCR 频率计算 xff1a 定时器频率 PSC 43 1 ARR 43 1 占
  • Nvidia Xavier GPIO 输入输出 中断 PWM

    文章目录 前言Jetson GPIO安装可用引脚点亮LEDGPIO输出示例GPIO输入示例GPIO EventGPIO InterruptPWM微信公众号 前言 Nvidia Jetson AGX Xavier 硬件相关 这篇讲到Xavie
  • px4的PWM是如何输出的

    如果有io芯片 xff0c 且使用了io作为输出PWM的设备 则fmu将mixer传输给io xff0c io进行混控计算并输出PWM xff0c 将pwm结果传递回fmu xff0c 此时无app订阅acuator outpus xff0
  • 首个单芯片超小封装I2C转PWM解决方案

    ZW10I8X系列 高性能工业级16位高精度I2C转PWM接口SOC芯片 接口标准 符合飞利浦的I2C标准规范 xff0c 目前支持的速度为小于100kbit 建议使用50k 1个使能脚 xff08 ZW10I8xE后缀带E的 xff09
  • jetson nx fan auto pwm

    参考 xff1a Jetson Nano PWM自动调速 Ay yzx的博客 CSDN博客 代码 xff1a usr bin env python import os import commands from the path of thi
  • PWM脉宽调制 与PPM、SBUS、DSM2 协议 详细介绍

    原文地址 xff1a http www 5imx com portal php mod 61 view amp aid 61 1351 相信这个问题是每个模友在新入航模坑时都会遇到的问题 xff0c 也仍然在困扰着不少新手 这里简单对比解释
  • LED点阵

    本周的学习内容是LED点阵的使用 其实LED点阵与动态数码管的原理非常相似 xff0c 都是通过扫描和视觉暂停现象来实现多个LED同时点亮的视觉效果 不同的是 xff0c 点阵可以通过74HC595来实现三根线串行输入多根线并行输出的效果
  • STM32F103控制PCA9685产生16路PWM波控制SG90舵机

    STM32控制PCA9685产生16路PWM波控制SG90舵机 如果你能点开这篇文章 xff0c 说明你已经知道PCA9685是多么强大 xff0c NXP公司原本做这片芯片是为了提供给LED使用 xff0c 在其官方文档里也能看到所有PW
  • 快速学习Stm32舵机控制板控制一个舵机运动

    PWM是什么 PWM 英文名Pulse Width Modulation 是脉冲宽度调制缩写 它是通过对一系列脉冲的宽度进行调制 等效出所需要的波形 包含形状以及幅值 对模拟信号电平进行数字编码 也就是说通过调节占空比的变化来调节信号 能量
  • 学习PS2无线手柄解码通讯手册

    学习 PS2 无线手柄的使用方法 将市场上 PS2 手柄通过解码应用到我们自己产品之中 比如控制智能车 机械臂等等任何涉及无线通信控制的一些diy场景 本次主要让大家了解 PS2 无线手柄的工作原理 以及掌握 PS2 无线手柄的使用并最终通
  • STM32 PWM基本知识及配置过程

    STM32 PWM基本知识及配置过程 将通用定时器分为四个部分 1 选择时钟 2 时基电路 3 输入捕获 4 输出比较 本节定时器PWM输出主要涉及到定时器框图右下方部分 即输出比较部分 和上一讲相同 时基时钟来源于内部默认时钟 对此有疑问
  • PMIC驱动之—PMIC硬件相关知识

    PMIC 电源管理集成电路 Power Management IC 在之前项目中 驱动最小系统 对于PMIC这块儿很懵懂 故抽时间查看一些优秀博文及资料 加强对电源管理的理解 本文介绍 PMIC 硬件电路相关的一些知识 在此作一些阶段性的学
  • 什么是死区时间

    死区时间是PWM输出时 为了使H桥或半H桥的上下管不会因为开关的关断延迟问题发生同时导通而设置的一个保护时段 通常也指pwm响应时间 由于IGBT 绝缘栅极型功率管 等功率器件都存在一定的结电容 所以会造成器件导通关断的延迟现象 一般在设计
  • LCD和LED屏幕的工作原理总结

    1 点阵取模原理之横向取模与纵向取模 1 1 针式打印机 针式打印机16针是纵向排列 每次打印垂直的16bit 然后右移一bit 继续下列打印 字节的MSB表示最上面的点 字节LSB表示最下面的点 由于汉字字模的点阵是横向排列的 而提供给打
  • 快速学习Stm32舵机控制板控制多个舵机运动以及调速

    本次分享stm32对多个舵机的控制 之前讲解过单个舵机的控制 以及控制原理 定时器的使用和pwm的输出来控制一个舵机的角度转向 这次就和大家分享一下多个舵机的控制以及调速 利用单片机实现对 8 个舵机的同时控制 掌握多个舵机控制程序实现方法
  • 检测硬盘是否正在被访问

    我正在尝试制作一个非常简单的硬盘访问监视器像那些根据驱动器使用情况闪烁的嵌入式 LED 一样工作 那个 LED 确实对我很有帮助 但我使用的笔记本电脑没有它 因此 我制作了一个简单的托盘图标应用程序 但我不知道如何确定磁盘访问的变量 我搜索
  • 我可以更改 Android 设备的 LED 强度吗?

    有没有办法设置我想要的 LED 强度 我知道要打开 LED 我使用 p setFlashMode Camera Parameters FLASH MODE TORCH mycam setParameters p 但这段代码只是打开 LED
  • 罗技的 LED 照明 SDK 无法与我的 G502 配合使用

    我想得到罗技自己的 LED SDK http gaming logitech com en us developers正在使用我的 G502 但我不能 我使用的是 SDK 版本 8 82 7 这是迄今为止的最新版本 我在 SO 或互联网的其
  • 我可以检测 Android 设备上是否存在“LED 通知”吗?

    背景 我有一个带有通知的应用程序 我想支持 LED 通知 并且它运行良好 在我的偏好中 我允许用户自定义 LED 通知 问题 如果设备不支持 LED 自定义选项 我不想显示这些选项 因为这可能会让用户感到困惑 如果您拥有的只是廉价的 And
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我

随机推荐