使用LoRa远程控制路灯(PWM调光以及LoRaWAN单播、组播、广播)

PWM调光

1、使用有pwm波输出的引脚,本例子使用timer0,PA0引脚;

2、由于timer时钟的原因,mcu不能进入休眠;

3、主控使用EFM32,代码实现如下:

#define MAX_PULSE    (CPU_FREQ/1000-1) 
#define UNIT_PULSE   MAX_PULSE/100  //单位脉宽

void pwminit(void)
{
  GPIO_PinModeSet(gpioPortA,0,gpioModePushPull,0);  //PA0

  CMU_ClockEnable(cmuClock_TIMER0, true);  //timer0时钟使能
  
  TIMER_InitCC_TypeDef timerCCInit = 
  {
    .eventCtrl  = timerEventEveryEdge,
    .edge       = timerEdgeBoth,
    .prsSel     = timerPRSSELCh0,
    .cufoa      = timerOutputActionNone,
    .cofoa      = timerOutputActionNone,
    .cmoa       = timerOutputActionToggle,
    .mode       = timerCCModePWM,
    .filter     = true,
    .prsInput   = false,
    .coist      = false,
    .outInvert  = false,
  };
  
  TIMER_InitCC(TIMER0, 0, &timerCCInit);         //初始化捕获通道
  
  TIMER0->ROUTE |= TIMER_ROUTE_LOCATION_LOC0 | TIMER_ROUTE_CC0PEN; 
  TIMER_TopSet(TIMER0, MAX_PULSE);               //周期
  TIMER_CompareBufSet(TIMER0, 0, UNIT_PULSE*50); //脉宽,默认占空比50%
  
  TIMER_Init_TypeDef timerInit =
  {
    .enable     = true,
    .debugRun   = true,
    .prescale   = timerPrescale1,
    .clkSel     = timerClkSelHFPerClk,
    .fallAction = timerInputActionNone,
    .riseAction = timerInputActionNone,
    .mode       = timerModeUp,
    .dmaClrAct  = false,
    .quadModeX4 = false,
    .oneShot    = false,
    .sync       = false,
  };
  
  TIMER_Init(TIMER0, &timerInit);               //初始化定时器
  TIMER0->CMD=TIMER_CMD_START;                  //启动定时器
}

void setpwmwidth(uint8 plusewidth)
{  
  TIMER_CompareBufSet(TIMER0, 0, UNIT_PULSE* plusewidth); //脉宽
}

 

 

以上使用1khz的频率,脉宽比分别为30%、50%、80%,当然对应的灯亮度也就不一样。

LoRaWAN单播、组播、广播

由于节点工作在Class C模式下,那么下发数据所有的设备都能收到(下发数据的时候,个别设备处于上行模式的情况除外),节点通过短地址(Address)以及应用会话密钥(AppSkey)、网络会话密钥(NwkSkey)、下行计数器(DownLinkCounter)来判定是否是自己的数据

1、单播下发:使用节点入网后的参数;

2、组播(多播)下发:需要单独添加,多播参数可看Node的协议栈里面的定义:

/*!
 * LoRaMAC multicast channel parameter
 */
typedef struct sMulticastParams
{
    /*!
     * Address
     */
    uint32_t Address;
    /*!
     * Network session key
     */
    uint8_t NwkSKey[16];
    /*!
     * Application session key
     */
    uint8_t AppSKey[16];
    /*!
     * Downlink counter
     */
    uint32_t DownLinkCounter;
    /*!
     * Reference pointer to the next multicast channel parameters in the list
     */
    struct sMulticastParams *Next;
}MulticastParams_t;

可以看出,这是一个链表节点,可以根据应用需要定义组播的个数。

3、广播下发:配置所有的节点相同的组播参数即可。

由于SX1301工作在半双工模式,且只有一个下行通道,所以尽量使用组播或者广播下发控制命令。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

freemote

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

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

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

打赏作者

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

抵扣说明:

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

余额充值