Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2017:lna-ctrl

Toto je starší verze dokumentu!


(Pracovni)

Zadání

Navrhněte jednotku MCU_board s procesorem LPC1111JHN33/103, umožňující ovládání externě připojeného LNA. MCU_board je bateriově napájená. Pomocí vhodné řídící logiky zajistěte: kontrolu napětí baterie, řízené nabíjení baterie po připojení externího nabíjecího adaptéru, odpojování napájení od externího LNA při nabíjení a komunikaci s PC, signalizaci stavu pomocí LED (zařízení ready, vybitá baterie apod.), výpis aktuálního stavu do PC. Součástí externího LNA je 7-bitový digitální (SPI) atenuátor Skyworks SKY12343-364LF, pro který vytvořte drivery.


Úvod

Cílem projektu je sestavit kompletní HW včetně obslužného FW, umožňující řízení externí DPS realizující nízkošumový předzesilovač, jehož součástí je digitální atenuátor, ovladatelný přes SPI. Aby bylo zařízení kompaktní, bude pro napájení využit Li-Ion akumulátor (nominální napětí: 7,2V; kapacita: 2600 mAh).

Řešení

Protože při psaní FW přestal být procesor LPC1111JHN33/103 dostačující (především flash paměťú, byl v průběhu vývoje nahrazen procesorem LPC11U34FHN33/311, obsahující především větší flash paměť a nově vnitřní paměť EEPROM. Stejně tak umožňuje v budoucnu použití USB bez externího driveru (FTDI). Schéma disponuje drobnými úpravami, které nejsou promítnuty ve verzi DPS, pro kterou byl psán FW - jde o nepatrné úpravy typu odstranění již zbytečných jumperů, využití stabilizátorů s vyšším proudovým zatížením, nahrazení 2 SMD LED za RGB LED, možnost nevyužití FTDI.

 Obr.1 Schéma zapojení MCU_board 

Nabíjení:

Nabíjecí část je ve schématu v levém dolním rohu. Tato část je složena ze vstupní ochrany proti přepólování a přepětí na vstupním konektoru. Součástí je i vratná 1.1A pojistka. Jako nabíjecí obvod je využit IO MCP73213 (http://ww1.microchip.com/downloads/en/DeviceDoc/20002190C.pdf).

Pomocí AD převodníku procesoru je snímání napětí na napájecím konektoru. Je-li toto napětí větší než 10V, dojde k sepnutí tranzistoru pomocí pinu procesoru CHARGE_CURRENT_SET, což zajistí snížení odporu na pinu PROG nabíjecího obvodu. Je-li napětí baterie menší než 7,4V nabíjecí obvod změní stav pinu STAT na stav nízké impedance, což zapříčiní změnu napětí na pinu procesoru STAT_DET (z 3V0 na 0V). Nabíjení je v této fázi aktivní. Jakmile je baterie nabita, nabíjecí obvod změní pin STAT na úroveň vysoké impedance, pin procesoru STAT_DET změní napětí z 0V na 3V0 - nabíjení je kompletní a procesor rozpojí tranzistor na pinu CHARGE_CURRENT_SET, díky čemuž přejde nabíjecí obvod do režimu shutdown. Po celou dobu nabíjení je externí LNA odpojeno. Handler obsluhující nabíjení:

extern void Charge_handler(void)
{
	if((voltage.ext_pwr < EXT_PWR_TRESHOLD) && (voltage.battery_voltage > BATTERY_CHARGED))
	{
		flags.charging = false;
		flags.batt_charged = true;
		flags.batt_need_charging = false;
		if(state != pc_connected)
		state = normal_operation;
		RF_SUPPLY_EN(true);
	}
	else if((voltage.ext_pwr < EXT_PWR_TRESHOLD) && (voltage.battery_voltage < BATTERY_CHARGED))
	{
		flags.charging = false;
		flags.batt_need_charging = true;
		flags.batt_charged = false;
		state = batt_need_charging;
		RF_SUPPLY_EN(true);
	}
 
	if(voltage.ext_pwr > EXT_PWR_TRESHOLD)
	{
 
		if(!flags.charging)
		{
			CHARGE_CURRENT_SET(true);
			delay_us(750); 
			ADC_read_channel_fast(adc_stat_det);
 
			if(voltage.stat_det > STAT_DET_TRESHOLD)
			{
				CHARGE_CURRENT_SET(false);
				flags.charging = false;
			}
			else
			{
				flags.charging = true;
				flags.batt_charged = false;
				state = charging;
				RF_SUPPLY_EN(false);
			}
		}
		else if((voltage.stat_det > STAT_DET_TRESHOLD) && (flags.charging == true))
		{
			flags.charging = false;
			flags.batt_need_charging = false;
			flags.batt_charged = true;
			state = normal_operation;
			CHARGE_CURRENT_SET(false);
			RF_SUPPLY_EN(true);
		}
		else
		{
			// charging succesfully running
		}
	}
	else if((voltage.ext_pwr > EXT_PWR_TRESHOLD) && (voltage.battery_voltage < BATT_CHARGE_TRESHOLD))
	{
		state = charging_err; 
	}
}

Využitím pravidelného logování (1x za 15 min) byla změřena nabíjecí křivka:

Komunikace a ovládání:

Komunikace přes USB je realizována pomocí externího FTDI driveru. Ve schématu je komunikace v pravém dolním rohu. Protože FTDI by při napájení napětí 3V3 potřeboval externí krystal, je napájen přímo z USB. FTDI a celá komunikace je tedy aktivní pouze v případě, že dojde k připojení USB konektoru. Vzhledem k tomu, že procesor je napájen 3V3, bylo nutné využít level shifter (3V3 ↔ 5V), který je opět napájen pouze v případě, že je připojen USB konektor. Komunikace je nastavena na 9600 Bd, 8N1 a je využito kruhových bufferů pro RX a TX. Handler zajišťující detekci připojení k PC:

extern void PC_detection_handler(void)
{
	if(voltage.usb_voltage > USB_VOLTAGE_TRESHOLD && (!flags.uart))
	{
		flags.uart = true;
		Chip_UART_Init(LPC_USART);
		RF_SUPPLY_EN(false);
		state = pc_connected;
	}
	else if((voltage.usb_voltage < USB_VOLTAGE_TRESHOLD) && ((state == pc_connected) || (state == batt_need_charging)))
	{
		flags.uart = false;
		Chip_UART_DeInit(LPC_USART);
 
		if(flags.charging)
		{
			state = charging;
			RF_SUPPLY_EN(false);
		}
		else if(flags.batt_need_charging)
		{
			RF_SUPPLY_EN(true);
			state = batt_need_charging;
		}
		else if(flags.charging_err)
		{
			RF_SUPPLY_EN(true);
			state = charging_err;
		}
		else
		{
			state = normal_operation;
			RF_SUPPLY_EN(true);
		}
	}
}

Je-li USB připojen, řídící DPS začne posílat pravidelnou zprávu (aktuálně po 1s), obsahující informace o aktuálním stavu. Součástí této zprávy je synchronizační znak (AA 11), dále struktura obsahující jednotlivá napětí [mV] (napětí externě připojeného adaptéru, detektor nabíjecího obvodu pomocí jeho pinu STAT, napětí USB, napájecí napětí nízkošumového předzesilovače, napětí baterie), IAP kód určující, zda bylo správně zapsáno do pamětí EEPROM, aktuální hodnotu nastaveného útlumu digitálního atenuátoru, hodnoty všech flagů. Příklad takové zprávy je např:

11 AA 11 02 C4 0B 8A 13 14 00 47 20 00 00 1A 04 C9 00 

Rozparsováním lze získat zpětně jednotlivé informace:

V budoucnu tato data budou rozparsována a prezentována pomocí jednoduché PC aplikace. Posláním zprávy procesoru lze nastavit externí atenuátor (http://www.skyworksinc.com/uploads/documents/201355C.pdf). Například, pro nastavení hodnoty útlumu 10,5 dB je nutné poslat sekvenci 11150, kde 1 je příkaz pro nastavení atenuátoru, 11 je hodnota celočíselného útlumu v dB a 50 je hodnota desetinné části útlumu. Pomocí logického analyzátoru lze po zadání tohoto příkazu vidět data, která odpovídají požadovanému nastavení dle katalogového listu:

Tato nastavená hodnota je současně uložena do vnitřní EEPROM paměti, která je přístupná pomocí IAP. Pro její využití byly využity a lehce upraveny zdrojové soubory dostupné na https://os.mbed.com/users/okano/code/IAP/ Hodnota nastaveného útlumu uložená v EEPROM se pak při resetu vyčte z paměti a nastaví atenuátor. Není tak třeba vždy po resetu nutné nastavovat požadovaný útlum stále znovu.

Závěr

Vzhledem k faktu, že je využit procesor umožňující využití USB bez přídavného driveru (FTDI), nebude nutné v další verzi HW mít FTDI.

2017/lna-ctrl.1514915233.txt.gz · Poslední úprava: 2018/01/02 18:47 autor: Milan Sedlák