当前位置 博文首页 > freemote的博客:使用LoRa远程控制路灯(PWM调光以及LoRaWAN单播

    freemote的博客:使用LoRa远程控制路灯(PWM调光以及LoRaWAN单播

    作者:[db:作者] 时间:2021-07-18 19:14

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

    cs