通用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) 的相关文章

  • px4的PWM是如何输出的

    如果有io芯片 xff0c 且使用了io作为输出PWM的设备 则fmu将mixer传输给io xff0c io进行混控计算并输出PWM xff0c 将pwm结果传递回fmu xff0c 此时无app订阅acuator outpus xff0
  • pixhawk: px4代码初学分析:追溯电机控制--pwm输出

    追溯电机控制 pwm输出 正常工作状态下pwm输出过程简述 xff1a 其他状态下pwm输出 xff1a 正常工作状态下pwm输出过程简述 xff1a 姿态解算部分得出姿态控制量通过px4io cpp把姿态控制量发送给IOIO串口读取姿态控
  • 首个单芯片超小封装I2C转PWM解决方案

    ZW10I8X系列 高性能工业级16位高精度I2C转PWM接口SOC芯片 接口标准 符合飞利浦的I2C标准规范 xff0c 目前支持的速度为小于100kbit 建议使用50k 1个使能脚 xff08 ZW10I8xE后缀带E的 xff09
  • STM32关闭PWM输出时,让IO输出固定高或低电平的方法。

    看到有很多人在网上询问停止PWM时如何获取固定输出 xff0c 记录在此供参考 方法1 xff1a 设置占空比为0xffff 或0 后即可得到想要的0或1输出 方法2 xff1a 配置回通用IO口 xff0c 再设置为0或1 以上两种方法是
  • STM32输出PWM波形错误解析

    一 背景 项目中需要用STM32F407输出4路PWM波形控制两个A4950模块 xff0c 从而驱动2个直流电机 使用TIM1的在PE9 PE11 PE13 PE14上分别产生4路PWM波形 xff0c 前两路 xff08 记作pwm1
  • STM32Cube的PWM控制算法篇(一)数字锁相环初步设计Digital phase locked loop

    数字锁相环 Digital phase locked loop数字锁相环是一个通过PID算法使PWM调频改变相位 xff0c 以达到与目标模型同频同相或同频稳定相位差的目的 xff0c 在实际应用中较为常见 xff0c 其中包括齿轮对接 远
  • Hi3798 PWM输出控制背光

    一 PWM配置说明 Hi3798 具有3个PWM输出端口 通过查阅 Hi3798M V200 低功耗方案 使用指南 pdf 可得 xff1a 通过查阅Hitool工具可以查看到三个PWM端口的寄存器分别为 xff1a 通过原理图可得 xff
  • stm32通用定时器输出PWM控制舵机

    stm32的通用定时器有TIM2 TIM3 TIM4 TIM5 xff0c 每个定时器都有独立的四个通道可以作为 xff1a 输入捕获 输出比较 PWM输出 单脉冲模式输出等 stm32除了基本定时器 xff0c 其他定时器都能输出PWM
  • STM32以中断的方式点亮LED小灯(标准库)

    STM32以中断的方式点亮LED小灯 xff08 标准库 xff09 文章目录 STM32以中断的方式点亮LED小灯 xff08 标准库 xff09 一 认识中断1 中断优先级 xff1a 2 中断嵌套 xff1a 3 中断执行流程4 中断
  • STM32F103C8T6 PWM驱动舵机(SG90)

    小知识 xff1a 同一个定时器 xff0c 不同通道输出不同输出PWM的特点 对于同一个定时器的不同通道输出PWM xff0c 因为它们是共用一个计数器的 xff0c 所以频率必须一样 xff0c 而占空比由各自的CCR决定 xff0c
  • 舵机PWM信号转互斥继电器开关信号

    本文由 麦粒电子 撰写 xff0c 并提供相应产品服务 叙述 上次的PWM转继电器开关方案得到大家的不少好评 xff08 博客链接 xff09 xff0c 但是发现有些玩家需要一路PWM同时去控制两路继电器开关通断 xff0c 并且两者是互
  • 直流电机控制 pwm 和 pid 算法

    下面的文章是我转载的 所以作者若是看到不允许转载 请给我留言或给我邮件 lushiliangcsdn 163 com 我会立即删除 转载原因 这篇文章把pid 算法解释的很详细 我担心以后这篇文章无故删除 才转载到我这边的 谢谢 转载来源于
  • 魔方机器人之下位机编程-----两种串口通信方式的比较

    由于上位机软件的串口通信部分和魔方复原算法部分已经完成 接下来的一步就是如何将魔方复原的具体步骤 字符串的形式 通过串口发送给单片机MC9S12XS128单片机了 调试的过程中 采用了两种串口通信的方式 一种是查询的方式 另一种是中断的方式
  • STM32 PWM基本知识及配置过程

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

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

    这里以TIM2为例 pwm c include pwm h uint16 t TIM2 CCR1 Val uint16 t TIM2 CCR2 Val uint16 t TIM2 CCR3 Val uint16 t TIM2 CCR4 Va
  • 检测硬盘是否正在被访问

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

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 我可以检测 Android 设备上是否存在“LED 通知”吗?

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

    我正在尝试使用一个通知 该通知也使用我的 S3 上的通知 LED 但由于某种原因 颜色将始终为蓝色 我猜这是默认值 我尝试使用不同的颜色但没有任何变化 其他应用程序 例如 Whatsapp Gmail 和 Facebook 在显示不同颜色的

随机推荐