使用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工作在半双工模式,且只有一个下行通道,所以尽量使用组播或者广播下发控制命令。

发布了35 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/freemote/article/details/101217601