Informatyka 
 
Oprogramowanie woltomierza i amperomierza
Hefajstos
Miernik panelowy w swojej pierwotnej postaci nie pozwalał na zmianę polaryzacji sygnału wejściowego, a jedynie odbierał dane z przetwornika analogowo-cyfrowego i przedstawiał je na wyświetlaczu. Prezentowane modyfikacje pozwalają prawidłowo współpracować z przystawkami pomiarowymi prezentowanymi w tym i poprzednim wydaniu NO.

Procedury obsługi poszczególnych przystawek pomiarowych składają się z dwóch funkcji: funkcji inicjalizującej, która przygotowuje stan miernika, oraz funkcji która jest cyklicznie wywoływana i która odpowiada za odebranie wyników pomiaru i przedstawieniu ich na wyświetlaczu. W trakcie budowy panelu pomiarowego zakładano, że przystawki pomiarowe będą bardzo proste. W przypadku amperomierza – będzie to opornik bocznikowy a w przypadku woltomierza – prosty dzielnik napięcia. Niestety w praktyce okazało się, że pomiar prądu wprowadza zbyt duże zaburzenia do mierzonego układu a przy dużych prądach moc jak wydziela się na oporniku bocznikowym jest sięga kilkunastu watów. Stąd pomysł by użyć gotowego układu pomiarowego który dodatkowo potrafi mierzyć prąd płynący w obu kierunkach. Jedynym problemem w tym wypadku było przesunięcie napięcia, które dla zerowego prądu wynosi w zastosowanym układzie 2.5V. Wymagało to napisania programu obsługi takiej przystawki.

Procedura inicjalizująca ustawia sposób wyświetlania w formacie #0.0 oraz zapamiętuje adres procedury pomiarowej. Ponadto ustawia jako wyjścia dwa jednobitowe cyfrowe porty wyprowadzone na zewnątrz panelu pomiarowego, które użyjemy do wskazania polaryzacji aktualnie mierzonego prądu.

initVoltmeterS25:	ldi	r16, 0b00010010 ; #0.0

			mov	r8, r16
			ldi	zl, LOW(showVoltage25)
			ldi	zh, HIGH(showVoltage25)
			sbi	DDRD, 4
			sbi	DDRD, 3
			rcall	setTimerHandler

W procedurze wyświetlającej wartość – od wielkości odebranej z przetwornika analogowo cyfrowego (wywołanie funkcji adcGetValue), odejmujemy wartość odpowiadającą zerowemu prądowi. Jeśli otrzymana wartość jest dodatnia wyświetlamy ją, jednocześnie ustawiając odpowiednie sygnały dla diody LED która pokaże polaryzację dodatnią

showVoltage25:		push	r18
			push	r19
			rcall	adcGetValue	

			subi	r18, LOW(500)	
			sbci	r19, HIGH(500)
			mov	r16, r19
			andi	r16, $80
			breq	sw251 

		; negative value
			sbi	PORTD, 4
			cbi	PORTD, 3
			com	r18
			com	r19
			inc	r18
			brne	sw253
			inc	r19
sw252:			rjmp	sw253

sw251:		; positive value
			sbi	PORTD, 3
			cbi	PORTD, 4
					
sw253:			clc			; /2
			ror	r19
			ror	r18
				
			rcall	displayProperNumber	
			pop	r19
			pop	r18
			ret

Jeśli wynik jest ujemny, zmienimy jego znak i ustawiamy stan diody LED tak by wskazywała odwrotną polaryzację.

Inicjalizacja woltomierza wymaga podania jago dokładności bo używając różnych dzielników napięcia możemy zbudować woltomierz o różnych dokładnościach nie wymagający modyfikacji programu. W przypadku amperomierza, potrzebne jest przeskalowanie napięć, lecz w woltomierzu, wystarczy zmienić oporniki by zmienić zakres z +/- 100V na +/-10V zwiększając jednocześnie dokładność pomiarową. Dlatego dla woltomierza przygotowano aż trzy procedury inicjujące różniące się jedynie ustawieniami wyświetlacza.

initVoltmeterA:		ldi	r16, 0b00010000
			rjmp	_initMeter

initVoltmeterB:		ldi	r16, 0b00010010
			rjmp	_initMeter

initVoltmeterC:		ldi	r16, 0b00010100

_initMeter:		mov	r8, r16
			ldi	zl, LOW(showVoltage)
			ldi	zh, HIGH(showVoltage)
			sbi	DDRD, 3
			sbi	DDRD, 4
			sbi	PORTD, 3
			cbi	PORTD, 4
			rcall	setTimerHandler

Tym razem jednak oprócz ustawienie stanów wyjść sygnalizujących polaryzację, ustawiamy także ich stan. To ważne, bo sygnały na tych wyjściach nie tylko sterują diodami LED, ale także włączają odpowiednie przełączniki pozwalające na zmianę polaryzacji wejściowego sygnału – i musimy ta polaryzację ustawić tak by pomiar był możliwy.

Sama procedura pomiarowa jest prosta. Czytamy wartość z przetwornika, a następnie sprawdzamy czy nie jest zerowa. Jeśli nie – to znaczy że mierzymy napięcie które ma odpowiednią polaryzację.

showVoltage:		push	r18
			push	r19
			rcall	adcGetValue
			mov	r16, r18
			or	r16, r19
			brne	sv02

			in	r16, PORTD
			andi	r16, $10
			brne	sv01					

			cbi	PORTD, 3
			sbi	PORTD, 4
			rjmp	sv02			

sv01:			sbi	PORTD, 3
			cbi	PORTD, 4

sv02:			rcall	displayProperNumber	
			pop	r19
			pop	r18
			ret

Jeśli jednak wykryliśmy wartość 0 – to możemy przypuszczać, że napięcie podłączono odwrotnie. W takim wypadku sprawdzamy jaki jest aktualny stan bitów sterujących polaryzacją i ustawiamy je przeciwnie.

 
Opinie
 
Facebook
 
  
45350 wyświetleń

numer 9/2016
2016-09-01

Od redakcji
Dydaktyka
Felieton
Literatura
Matematyka
Psychologia
Rozmaitości
Sztuka życia
Wakacje
Zrób to sam

nowyOlimp.net na Twitterze

nowy Olimp - internetowe czasopismo naukowe dla młodzieży.
Kolegium redakcyjne: gaja@nowyolimp.net; hefajstos@nowyolimp.net