发射功率也是射频基础指标,目前SX1278可以支持最大20dBm。
我正在学习LoRa和LoRaWAN,基本按照 官方资料+梳理解析+相关源码 的方式来记录笔记,相信对不少同行者有所帮助,可点此查看帖子LoRa学习笔记_汇总。
本文作者twowinter,转载请注明作者:http://blog.csdn.net/iotisan/
PA_HF and PA_LF are high efficiency amplifiers capable of yielding RF power programmable in 1 dB steps from -4 to
+14dBm directly into a 50 ohm load with low current consumption. PA_LF covers the lower bands (up to 525 MHz), whilst
PA_HF will cover the upper bands (from 779 MHz). The output power is sensitive to the power supply voltage, and typically
their performance is expressed at 3.3V.
PA_HP (High Power), connected to the PA_BOOST pin, covers all frequency bands that the chip addresses. It permits
continuous operation at up to +17 dBm and duty cycled operation at up to +20dBm. For full details of operation at +20dBm
please consult section 5.4.3
Table 33 Power Amplifier Mode Selection Truth Table
PaSelect | Mode | Power Range | Pout Formula |
0 | PA_HF or PA_LF on RFO_HF or RFO_LF | -4 to +15dBm | Pout=Pmax-(15-OutputPower) Pmax=10.8+0.6*MaxPower [dBm] |
1 | PA_HP on PA_BOOST, any frequency | +2 to +17dBm | Pout=17-(15-OutputPower) [dBm] |
Notes
- For +20 dBm restrictions on operation please consult the following .
- To ensure correct operation at the highest power levels ensure that the current limiter OcpTrim is adjusted to permit delivery of the requisite supply current.
- If the PA_BOOST pin is not used it may be left floating
芯片有几个不同的射频管脚,PA_HF(大于779 MHz) and PA_LF(小于525 MHz)都最多输出14dBm。PA_BOOST则比较厉害点,可持续输出17dBm,duty cycled operation周期性工作可飙到20dBm。
有个朋友上次做了868MHz的LoRa,蛋疼地用了RFO_HF引脚,只能输出14dBm。要是多看下datasheet,也许就能避免这些问题了。
总的来说,目前像我们用了PA_BOOST,那么套用公式,就是可以常规输出2-17dBm,由寄存器控制。如果要输出20dBm,则要看接下去这一章节。
The SX1276/77/78/79 have a high power +20 dBm capability on PA_BOOST pin, with the following settings:
Table 34 High Power Settings
Register | Address | Value for High Power | Default value PA_HF/LF or +17dBm | Description |
RegPaDac | 0x4d | 0x87 | 0x84 | Set Pmax to +20dBm for PA_HP |
Notes
Specific Absolute Maximum Ratings and Operating Range restrictions apply to the +20 dBm operation. They are listed in
Table 35 and Table 36.
The duty cycle of transmission at +20 dBm is limited to 1%, with a maximum VSWR of 3:1 at antenna port, over the
standard operating range [-40;+85°C]. For any other operating condition, contact your Semtech representative.
如果要设置20dBm,则必须对高功率寄存器(RegPaDac)进行配置。如果用 PA_LF 和 PA_HF 那就不需要设置高功率寄存器(RegPaDac)。20dBm发送时占空比最大只能为1%。天线驻波比不能超过3:1。供电电压为2.4~3.7V。
IoT小能手twowinter注:此种情况下输出功率为 20 - (15 - OutputPower),也就是5~20dBm。这就目前绝大多数厂家对外宣称的功率参数。
The power amplifiers of SX1276/77/78/79 are protected against current over supply in adverse RF load conditions by the over current protection block. This has the added benefit of protecting battery chemistries with limited peak current capability and minimising worst case PA consumption in battery life calculation. The current limiter value is controlled by the OcpTrim bits in RegOcp, and is calculated according to the following formulae:
电流过载保护。RegOcp的OcpTrim可以限制最大电流。
LoRa这部分的代码是使用LORAMAC_DEFAULT_TX_POWER这个宏来定义,这个宏的值是根据各地区的数值来的,有的地区默认是14dBm,有的地区默认是20dBm。
具体可以查看LoRaWAN协议V1.0.2中文版_配套文件 地区参数(物理层)。
在SendFrameOnChannel()这个函数中有具体的调用,根据不同地区参数,调用Radio.SetTxConfig(),把所有的地区参数一并设置进去。
void SX1276SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev,
uint32_t bandwidth, uint32_t datarate,
uint8_t coderate, uint16_t preambleLen,
bool fixLen, bool crcOn, bool freqHopOn,
uint8_t hopPeriod, bool iqInverted, uint32_t timeout )
{
uint8_t paConfig = 0;
uint8_t paDac = 0;
SX1276SetModem( modem );
paConfig = SX1276Read( REG_PACONFIG );
paDac = SX1276Read( REG_PADAC );
paConfig = ( paConfig & RF_PACONFIG_PASELECT_MASK ) | SX1276GetPaSelect( SX1276.Settings.Channel );
paConfig = ( paConfig & RF_PACONFIG_MAX_POWER_MASK ) | 0x70;
if( ( paConfig & RF_PACONFIG_PASELECT_PABOOST ) == RF_PACONFIG_PASELECT_PABOOST )
{
if( power > 17 )
{
paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_ON;
}
else
{
paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_OFF;
}
if( ( paDac & RF_PADAC_20DBM_ON ) == RF_PADAC_20DBM_ON )
{
if( power < 5 )
{
power = 5;
}
if( power > 20 )
{
power = 20;
}
paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 5 ) & 0x0F );
}
else
{
if( power < 2 )
{
power = 2;
}
if( power > 17 )
{
power = 17;
}
paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 2 ) & 0x0F );
}
}
else
{
if( power < -1 )
{
power = -1;
}
if( power > 14 )
{
power = 14;
}
paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power + 1 ) & 0x0F );
}
SX1276Write( REG_PACONFIG, paConfig );
SX1276Write( REG_PADAC, paDac );
......
}
另外本尊还弄到官方旧的驱动库,大家看看就好了。_
1.设置频点时,顺便把是否PA Select给配置了。
void SX1276LoRaSetRFFrequency( uint32_t freq )
{
LoRaSettings.RFFrequency = freq;
freq = ( uint32_t )( ( double )freq / ( double )FREQ_STEP );
SX1276LR->RegFrfMsb = ( uint8_t )( ( freq >> 16 ) & 0xFF );
SX1276LR->RegFrfMid = ( uint8_t )( ( freq >> 8 ) & 0xFF );
SX1276LR->RegFrfLsb = ( uint8_t )( freq & 0xFF );
SX1276WriteBuffer( REG_LR_FRFMSB, &SX1276LR->RegFrfMsb, 3 );
SX1276Read( REG_LR_PACONFIG, &SX1276LR->RegPaConfig );
if( LoRaSettings.RFFrequency > 860000000 )
{
SX1276LR->RegPaConfig = ( SX1276LR->RegPaConfig & RFLR_PACONFIG_PASELECT_MASK ) | RFLR_PACONFIG_PASELECT_RFO;
}
else
{
SX1276LR->RegPaConfig = ( SX1276LR->RegPaConfig & RFLR_PACONFIG_PASELECT_MASK ) | RFLR_PACONFIG_PASELECT_PABOOST;
}
SX1276Write( REG_LR_PACONFIG, SX1276LR->RegPaConfig );
}
2.设置是否使能20dBm
void SX1276LoRaSetPa20dBm( bool enale )
{
SX1276Read( REG_LR_PADAC, &SX1276LR->RegPaDac );
SX1276Read( REG_LR_PACONFIG, &SX1276LR->RegPaConfig );
if( ( SX1276LR->RegPaConfig & RFLR_PACONFIG_PASELECT_PABOOST ) == RFLR_PACONFIG_PASELECT_PABOOST )
{
if( enale == true )
{
SX1276LR->RegPaDac = 0x87;
}
}
else
{
SX1276LR->RegPaDac = 0x84;
}
SX1276Write( REG_LR_PADAC, SX1276LR->RegPaDac );
}
3.重点部分,设置发射功率。
void SX1276LoRaSetRFPower( int8_t power )
{
SX1276Read( REG_LR_PACONFIG, &SX1276LR->RegPaConfig );
SX1276Read( REG_LR_PADAC, &SX1276LR->RegPaDac );
if( ( SX1276LR->RegPaConfig & RFLR_PACONFIG_PASELECT_PABOOST ) == RFLR_PACONFIG_PASELECT_PABOOST )
{
if( ( SX1276LR->RegPaDac & 0x87 ) == 0x87 )
{
if( power < 5 )
{
power = 5;
}
if( power > 20 )
{
power = 20;
}
SX1276LR->RegPaConfig = ( SX1276LR->RegPaConfig & RFLR_PACONFIG_MAX_POWER_MASK ) | 0x70;
SX1276LR->RegPaConfig = ( SX1276LR->RegPaConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 5 ) & 0x0F );
}
else
{
if( power < 2 )
{
power = 2;
}
if( power > 17 )
{
power = 17;
}
SX1276LR->RegPaConfig = ( SX1276LR->RegPaConfig & RFLR_PACONFIG_MAX_POWER_MASK ) | 0x70;
SX1276LR->RegPaConfig = ( SX1276LR->RegPaConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 2 ) & 0x0F );
}
}
else
{
if( power < -1 )
{
power = -1;
}
if( power > 14 )
{
power = 14;
}
SX1276LR->RegPaConfig = ( SX1276LR->RegPaConfig & RFLR_PACONFIG_MAX_POWER_MASK ) | 0x70;
SX1276LR->RegPaConfig = ( SX1276LR->RegPaConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power + 1 ) & 0x0F );
}
SX1276Write( REG_LR_PACONFIG, SX1276LR->RegPaConfig );
LoRaSettings.Power = power;
}
4.总体流程
void SX1276LoRaInit( void )
{
......
SX1276LoRaSetRFFrequency( LoRaSettings.RFFrequency );
SX1276LoRaSetPa20dBm( true );
SX1276LoRaSetRFPower( LoRaSettings.Power );
......
}