当前位置 博文首页 > freemote的博客:使用LoRa远程控制路灯(PWM调光以及LoRaWAN单播
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%,当然对应的灯亮度也就不一样。
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