Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web development, networking and server security. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Основни Почетни Пакет - Туторијал # 5



# 5 Туторијал - (Део 1) Коришћење команде ПВМ - Преглед и Увод
ауторска права, Петар Х. Андерсон, Одељење за ЕЕ,
Морган Стате Университи, Балтимор, МД Феб 7, '97

Увод.

Ширина импулсне модулације је техника за пружање једне излазне логике за одређено време и нулту логичну вредност за равнотежу времена.

Овај део Туториала # 5 показује како да контролишете осветљење ЛЕД користећи ову технику.

Други део овог упутства, опширније показује како се контролише брзина ДЦ мотора помоћу Л293 Дуал ‘Х’ Бридге Цонтроллер

ПВМ команда се такође може користити за пуњење кондензатора, како би приказала количине на јефтином 200 мВ ЛЦД Панелу метарима или волтметарима. Ово је представљено у Делу 3..

Коначно, у Делу 4. туторијал представља технику коју користи ПВМ команда за стално пуњење кондензатора на прогресивно веће напоне, све време поређујући ово са непознатим напоном. Коришћењем једног компаратора, рачунајући тип А/Д конвертор и приближавање узастопног А/Д конвертора су спроведени.

Хардверске конфигурације за Парт 1.

Молимо Вас да погледате слику # 1.

Имајте у виду да се струјно коло састоји од два тастера, један на П11 и један на П10. Имајте на уму да је тастер на П10 нови додатак. 4-битни ДИП прекидач на инпутима П15, П14, П13 и П12 требало би сачувати за наредни део овог туторијала.

Поред тога, постоји један ЛЕД на П2. Остале ЛЕД диоде на П3, П1 и П0 можете оставити за следећи део овог туторијала.

ПВМ - Преглед.

Када возите моторе један често жели да промени брзину мењањем напона на намотај. Међутим, веома је скупо да користите линеарни појачивач који обезбеђује 0 до 12 Волти на рецимо 2 Ампера.

Далеко јефтинија техника је да укључите транзистор (или ФЕТ снага) неко време, а затим га искључити на неки временски период. На пример, ако је напон +12 Волти, а транзистор је на 25, 50 или 75 одсто времена, ефективност напона на оптерећењу је 3.0, 6.0 и 9.0 Волти.

Горе наведено важи и за осветљење лампе.

ПВМ алгоритам.

Претпоставка да 8-битни ДУТИ променљива има вредност у опсегу од 0 до 255.. Ако је х, онда ће излаз бити висок х/256 за време и низак за равнотежу.

Посматрајмо акумулатор, где на сваком пролазу АЦЦ = АЦЦ + ДУТИ и ако не дође до прекорачења, водећи је довео ниско. Али ако не дође до прелива, водећи је доведен до једне логике.

Нека петља се понавља 256 пута.

Дакле, ако је ДУТИ нула, прекорачење се никад не јавља, а излаз је увек низак.

Ако је једна ДУТИ, прекорачење ће се јавити када АЦЦ пређе из ФФХ у 00Х. То ће се десити једном у 256 петљи. Тако ће излаз бити по једној логици, 1/256 времена. Слично томе, ако је ДУТИ 2, АЦЦ ће преврнути преко два пута. Дакле, излаз ће бити једна логика, од 2/256 времена. Ако је ДУТИ 255, домашај прекорачења ће се увек јавити, осим када је АЦЦ нула. Дакле, излаз ће бити висок од 255/256 времена.

Имајте на уму да ако је процес заобљен 256 пута, почетна вредност АЦЦ може бити било која вредност.То јест, додао нулу на било који број никада резултате у преливању, један је додао на било које резултате у преливању на само једном пролазу кроз петљу, итд.

У следећем програму, ДУТИ почиње од нуле и рампе до 255 и онда доле ка нули. Програм непрестаних петљи.

' Program PWM_1.BS2
'
' Illustrates use of PWM.  Causes LED on P2 to rise and fall in
' brightness.
'
' Note that this uses my implementation of the PWM command.
'
' P. H. Anderson, Dec 5, '97

DUTY	VAR BYTE
CYCLES	VAR BYTE

J	VAR BYTE	' cycles counter

ACCUM	VAR BYTE
ACCUM_NEW	VAR BYTE
N	VAR BYTE	' index in PWM

	DIRS=$00FF
	CYCLES = 100
MAIN:
	FOR DUTY=0 TO 20 STEP 2	' increase the brightness
	   GOSUB PWM_BURST
	NEXT	

	FOR DUTY=20 TO 0 STEP 2	' decrease the brightness
	   GOSUB PWM_BURST
	NEXT
	GOTO MAIN

PWM_BURST:	
	FOR J = 1 to CYCLES
	GOSUB _PWM
	RETURN

_PWM:
	FOR N=0 TO 255
	   ACCUM_NEW = ACCUM + DUTY
	   IF (ACCUM_NEW >= ACCUM) THEN NO_OVERFLOW
	   ' else
	   GOTO OVERFLOW
_PWM_1:	   ACCUM = ACCUM_NEW	
	NEXT
	RETURN

OVERFLOW:
	OUT2=1
	GOTO _PWM_1	' continue

NO_OVERFLOW:
	OUT2=0
	GOTO _PWM_1	' continue	


Дискусија.

Потпрограм_ПВМ спроводи алгоритам описан изнад. Имајте на уму да се подвлака (_) појављује пре ПВМ што је потребно као ПВМ кључна реч у ПБАСИЦ, попут ГОТО или ЛООКУП.

Увек покшајте дати својим променљивима и ознакама асоцијативна имена. Упркос мојим упозорењима, повремено ћу имати групу студената који ће користити њихова имена и имена пријатеља за ознаке и променљиве. Након потрошеног времена у задобијању њих самих безнадежно збуњени, они постају верници. У овом случају, ја сам стварно желео да користе ПВМ као етикету, јер описују управо оно што потпрограм ради. Међутим, постоји стварна командна названа ПВМ и једноставно решење је да је додате водећем подвлачењу.

У рутинској _ПВМ, ДУТИ се додаје АКУМУ. Ако је нова вредност већа или једнака тренутној вредности АКУМА, прекорачење се неће догодити. На пример, ако је АКУМ 254, а ДУТИ је 1, нова вредност је 255, и није било прекорачења. Дакле, нула је излаз на П2.

Међутим, ако је АКУМ 254 и ДУТИ је 2, нови резултат је пребачен преко 1. То јест, прекорачење изазива да нова вредност буде мања од садашње вредности АКУМА и логика један је излаз на П2.

Рутински ПВМ_БУРСТ назива се _ПВМ рутински ЦИКЛУС време. Тако да су ДУТИ и ЦИКЛУС прослеђени ПВМ_БУРСТ и _ПВМ за извршавање више пута утврђеним ЦИКЛУС са одређеним ДУТИ.

Главни програм једноставне рампе ДУТИ од 0 (ЛЕД искључен) до 20 (ЛЕД на 20/256 времена. Занимљиво је да ово одговара да ЛЕД буде мањи од 10 одсто времена, али око има очигледно логаритамски одговор. Нашао сам да је тамо био веома приметан недостатак прихватања промена у ЛЕД осветљењу који иде од 0 до 20, али проширујући ово са већим вредностима није се појавила већа светлост. Можете покушати сами.

У покретању ове рутине, ви ћете приметити да постоји приметно треперење. ПИЦ на Стамп ради са 20 МХз на сат што преводи са 5 милиона инструкција у секунди. Међутим, у извршавању БејзикСтамп програма, ПИЦ има велико оптерећење; симбол мора бити учитан од стране серијског ЕЕПРОМ, тумачен и извршен. То јест, ПИЦ је прилично брз, али у поређењу Стамп изгледа врло спор.

На пример, ПИЦ код доводи до непрестаног мењања стања:

TOP:
	BCF PORTB, 0	; set output to zero
	BSF PORTB, 0	' to one
	GOTO TOP


То ће изазвати излаз на ниском нивоу за 0,6 усецс и висок за 0,2 усецс

Стамп код да уради исту ствар:

TOP:
	OUT0 = 0
	OUT0 = 1
	GOTO TOP



Међутим, у вођењу овог Стамп кода, ПИЦ мора наћи команде са серијским ЕЕПРОМ, да их тумачи и спроводи утврђену акцију и све то повећава наведене временске вредности за фактор номинално 100.

Такође ћете приметити кашњење када је програм у МЕИН и ПВМ_БУРСТ, то јест, није у _ПВМ. Имајте на уму да се једино време тог стања налази на излазу у самој _ПВМ рутини.

Програм ПВМ_2.БС2.

Овај програм користи Стамп ПВМ команду. Имајте на уму да он замењује ПВМ_БУРСТ и _ПВМ потпроцедуру који су коришћени у претходном програму.

.
'
' P. H. Anderson, Dec 5, '97
' Causes LED on P2 to rise and fall in brightness.  Uses PWM commmand.
'
' P. H. Anderson, Dec 5, '97

DUTY	VAR BYTE
CYCLES	VAR BYTE

	DIRS=$00FF
	CYCLES = 100
MAIN:
	debug "."
	FOR DUTY=0 TO 20 STEP 2
	   PWM 2, DUTY, CYCLES
	NEXT

	FOR DUTY=20 TO 0 STEP 2
	   PWM 2, DUTY, CYCLES
	NEXT	

	GOTO MAIN


Дискусија

Имајте на уму да је формат команде ПВМ :

	PWM pin, duty, cycles


где је дути бајт у опсегу од 0 до 255, а циклус је број пута рутина као што се _ПВМ зове.

Сваком циклусу је потребно око 1 мсек да се изврши. Дакле, у овој рутини, ПВМ излази на одређеној дути за 100 циклуса, или око 100 мсек, а тиме и време потребно за ЛЕД да "појача" или "успори" номинално је 1.1 секунди (11 корака од ДУТИ).

У покретању ове рутине, приметићете да је знатно мање треперења него са мојом имплементацијом у претходном програму, а разлог је да је ПВМ команда сада директно извршавају од стране ПИЦ-а.

Међутим, нека треперења ће наставити да буду приметна када Стамп извршава ФОР - НЕКСТ, ГОТО, а посебно када извршава Дебуг инструкцију. Важно је напоменути да у осветљењу лампе или у контроли моторне брзине, као што је приказано у следећем делу овог туторијала, мора се потрошити велика већина времена у извршавању ПВМ инструкција.

Када се не изврши ПВМ инструкција, Стамп не извози никакав напон на дефинисаном пину, а самим тим, ако је прекомерна количина времена спроведена ван ПВМ инструкција, мотор ће успорити или зауставити се.

Паралакс имплементација од ПВМ команде напушта дефинисан пин као висок индуктивни отпор улаза на изласку команде. Значај ћете видети у деловима 3 и 4. овог упутства где ПВМ команда се користи да задржи наелектрисање на кондензатору.

Програм ПВМ_3.БС2.

Овај програм илуструје како дути може бити тако разнолик као и да мења осветљеност ЛЕДа. Притиском тастера ПБ11 или ПБ10 узрокује да ЛЕД постане светлији или блеђи.

' Program PWM_3.BS2
'

'
' P. H. Anderson, Dec 7, '97

	MAX_DUTY CON 30
	MIN_DUTY CON 0

DUTY	VAR BYTE
CYCLES	VAR BYTE

	DIRS=$00FF
	CYCLES = 100

SCAN:	BRANCH (INC>>2), [SAME, FASTER, SLOWER, SAME]

SAME:	
	PWM 2, DUTY, CYCLES
	GOTO SCAN

FASTER:
	DUTY=DUTY+2
	IF DUTY<=MAX_DUTY THEN SKIP_HI_LIM
	DUTY = MAX_DUTY		' already at the maximum
SKIP_HI_LIM:
	DEBUG ?DUTY
	PWM 2, DUTY, CYCLES
	GOTO SCAN

SLOWER:
	DUTY=DUTY-2
	IF DUTY>MIN_DUTY THEN SKIP_LO_LIM
	DUTY = MIN_DUTY		' already at the minimum
SKIP_LO_LIM:
	DEBUG ?DUTY
	PWM 2, DUTY, CYCLES
	GOTO SCAN


Дискусија

Подсетимо се да ako je тастер притиснут, Стамп чита улаз као логика 0. Размотрите следећу истинску табелу.

	PB11	PB10	State	Action

	0	0	0	Ambiguous
	0	1	1	Lower the duty
	1	0	2	Increase the duty
	1	1	3	Maintain the same duty


У овом случају имамо два тастера, један повезан са светлијим (или бржим мотором) и други са затамљеним (или споријим мотором). Дејства повезана са стањима 1, 2 и 3 су прилично јасна. Међутим, када корисник притисне оба и "светлији" и "затамљени" у исто време, намера овог корисника је помало нејасна и то је посао дизајнера производа (ви) да се бави таквим двосмисленим стањима. У овој примени, одлучио сам да дефинишем дејство за стање 0 да буде исто као и за стање 3; који задржава исту дути.

Међутим, стање би могло добро да се користи и за нешто друго, рецимо за укључивање ЛЕД-а или за искључивање .

У горе наведеном програму, стање од два прекидача чита учитавање улаза ниббле Ц. Имајте у виду да се два тастера налазе на вишем двобитном ниблу. Дакле, ( ИНЦ >> 2) резултат је број у опсегу од 0 до 3. Ово се пресликава на дејство користећи моћну БРАНЦХ инструкцију

Ако је дефинисано стање 0 или 3, ПВМ инструкција се извршава без промене радног тока.

Међутим, ако је притиснут тастер ПБ11 резултат је у бинарном %01 или стању 1, програм је преусмерен на БРЖЕ где је ДУТИ повећан са 2. Међутим, као што сам желео да максимална дути не прелази 30, тест се изводи да провери ДУТИ да не прелази ту максималну вредност и ако је тако, ДУТИ је ресетован на 30. ПВМ инструкција се извршава са новом вредношћу ДУТИ.

Ако је тастер ПБ10 притиснут, ток програма је усмерен на СПОРИЈЕ где је дути смањена са 2 на минималну вредност 0.

Проблем.

У ствари, постоји суптилан проблем са СПОРИЈОМ рутином у ПВМ_3.БС2

Размотрите следећи фрагмент из ПВМ_3.БС2.

SLOWER:
	DUTY=DUTY-2
	IF DUTY>MIN_DUTY THEN SKIP_LO_LIM
	DUTY = MIN_DUTY		' already at the minimum
SKIP_LO_LIM:
	DEBUG ?DUTY
	PWM 2, DUTY, CYCLES
	GOTO SCAN


Претпоставимо да је ДУТИ 2. Затим, одузимањем 2, ДУТИ је нула тако да ДУТИ није већа од МИН_ДУТИ (0). Дакле, ГОТО се не обавља, и дужност је постављена на МИН_ДУТИ (0).

Сада је ДУТИ 0. У одузимању 2, резултат је $ФЕ или 254. (Приметите уопштено). Дакле, то је веће од 0, а тиме и ПВМ команда се извршава са ДУТИ од $ФЕ, осветљење ЛЕД је јарко скоро као што се може добити када би ЛЕД диода требала да буде искључена. Проблем се наставља.

Два се поново одузима и резултира у $ ФК или 252, који је свакако већи од 0 и ПВМ се врши уз ДУТИ од 252.

Проблем представља чињеница да је ваљана вредност ДУТИ од нула до преко $ ФФ и $ ФЕ, а онда поново ради поређење да ли је ово мање од нуле, док Стамп не сматра да је то -2, већ 254 која није мања од нуле.

Постоје многе исправке и нисам сигуран да је следећи најјаснији. Имајте на уму да је уведен нови бајт променљиве НЕВ_ДУТИ. Два се одузима од ДУТИ и то се онда тестира да ли је то мање од претходне вредности ДУТИ. На пример 30 - 2 би било мање од 30.

Међутим, 0 - 2 = 254 није мања од претходне вредности од 0.То јест, ако је НЕВ_ДУТИ већа од ДУТИ, мора да се догодило подливање.

Дакле, у овој ревизији, ситуација подливања је откривена и ДУТИ је подешен на предвиђени МИН_ДУТИ.

  
SLOWER:
	NEW_DUTY=DUTY-2
	DEBUG ?DUTY
	IF (NEW_DUTY < DUTY) THEN SKIP_UNDERFLOW ' underflow
	NEW_DUTY = MIN_DUTY
SKIP_UNDERFLOW:
	IF NEW_DUTY>MIN_DUTY THEN SKIP_LO_LIM
	NEW_DUTY = MIN_DUTY		' already at the minimum
SKIP_LO_LIM:
	DUTY = NEW_DUTY
	PWM 2, DUTY, CYCLES
	GOTO SCAN



Немојте се обесхрабрити. Ове врсте проблема нису очигледне. Међутим, кад видите чудно понашање када покренете ваш програм користите Дебуг команду да истражи шта је узрок чудном понашању. Немојте се обесхрабрити и заваравати. То је једини начин да заиста научите, и та мудрост се протеже далеко изван Стампа.

Преглед.

Програм ПВМ_1.БС2. је илистрована имплементација ПВМ команде и надајмо се пренет иако је сам ПИЦ релативно брз, извршење команди Стамп траје знатно дуже.

ПВМ_2.БС2 програм илуструје употребу Стампове ПВМ команде и већи део треперења је био елиминисан као шифра спровођења где се команда директно извршава од стране ПИЦ. Ипак, постоји приметна треперења, током времена програм није извршио ПВМ команду.

Последњи програм је показао како ДУТИ циклус може бити промењен под контролом тастера улаза.

Такође открива да понекад живот може бацити неке непредвидиве и чудне ствари на вашем путу које могу бити много фрустрирајуће све док не пронађете и разумете проблем.

Како контролисати ДЦ мотор помоћу Л293 ДВОСТРУКО "Х" МОСТ у наредном делу овог туторијала.







Published (Last edited): 27-05-2012 , source: http://www.phanderson.com/stamp/tutorial_5.html