Използване на ADC и PWM модули в PIC16 микроконтролери, програмиране на PIC микроконтролери
Микроконтролерите PIC16 са оборудвани с 10-битов модул за аналогово-цифров преобразувател (ADC) с последователно приближение. Методът на последователното приближение включва получаване на резултат за няколко измервания (сравнения), с постепенно увеличаване на точността при всяко следващо сравнение. Така преобразуването се извършва в няколко машинни цикъла. Естествено този метод отстъпва по скорост на преобразуване на паралелните АЦП, при които резултатът се получава в един цикъл (машинен цикъл). Тук няма да задълбавам в тънкостите на различните методи, нужната информация може да се намери в нета.Фигурата по-долу показва блоковата диаграма на аналоговия вход на ADC:
Тук Rs е вътрешното съпротивление на източника на напрежение, ANx е линията на порта на микроконтролера, която има капацитет Cpin и ток на утечка Iu. Вътрешните връзки на микроконтролера имат съпротивление Ric. Превключвател SS, със съпротивление Rss, свързва линията на порта ANx към кондензатора Chold на ADC модула. Превключването на превключвателя SS става при избор на аналогов канал, всеки канал има свой превключвател. Съпротивлението на превключвателя на ключалката зависи от захранващото напрежение, графиката на зависимостта е показана на фигурата вдясно.Процесът на измерване на напрежението е както следва: когато е избран аналогов канал, превключвателят SS се превключва, като по този начин кондензаторът Chhold се свързва към съответната линия на порта на микроконтролера и започва да се зарежда. След получаване на командата започва процесът на преобразуване, по време на който кондензаторът се изключва от линията на порта.
След избор на аналогов канал с битовете CHS(2:0) на регистъра ADCON0 е необходимо да се организира определенпауза (Tacq), преди да започнете преобразуването, така че кондензаторът Chhold да има време да се зареди. Техническата документация предоставя изчислението на това време, което е представено по-долу: Времето за зареждане се влияе главно от вътрешното съпротивление на източника на напрежение Rs, което не трябва да надвишава 10 kΩ, за компенсиране на вътрешния ток на утечка Iu, в допълнение, съпротивлението на ключалката Rss и капацитета на самия кондензатор Chold, които може да се различават за различните модели микроконтролери.
Времето за преобразуване е 12Tad, където Tad е времето за получаване на един бит, за правилен резултат, Tad не трябва да бъде по-малко от 1,6 µs. Времето Tad в зависимост от честотата на тактовия генератор се избира чрез настройка на битовете ADCS(2:0), в листа с данни за микроконтролера има таблица за това, където можете да изберете правилната стойност. След края на преобразуването е необходимо да поставите на пауза поне 2 Tad, преди да започнете ново преобразуване, през това време кондензаторът Chhold не е свързан към избраната линия на порта на микроконтролера. По принцип, ако аналоговият канал не се променя и честотата на преобразуване е малка (времето между преобразуванията е по-голямо от Tacq + 2Tad), не можете да изчислите времезакъсненията Tacq, 2Tad и да забравите за тях.
За да използвате линиите на порта на микроконтролера за ADC, те трябва да бъдат конфигурирани като аналогови входове с битовете ANS(7:0) на регистъра ANSEL, докато линията на порта трябва да бъде конфигурирана за вход с битовете на регистъра TRIS. След това се избира желаният аналогов канал.
Резултатът от преобразуването (10 бита) се съхранява в регистрите ADRESH и ADRESL. Тези регистри са сдвоен 16-битов регистър, резултатът може да бъде записан с дясно или ляво подравняване, както е показано на снимката по-долу.Подравняването се конфигурира с помощта на бита ADFM в регистъра ADCON0.
Външното напрежение от щифта Vref или вътрешното Vdd от захранването може да се използва като референтно напрежение, зададено от бита VCFG. За да се увеличи точността на резултата, еталонното напрежение трябва да се стабилизира с минимално ниво на пулсации. С референтно напрежение Vref =5 V, получаваме разделителна способност от 5V/1024=0,0049 V=4,9 mV за 10-битов резултат. За да получите 8-битов резултат, е необходимо да приложите ляво подравняване и да прочетете само регистъра ADRESH, в този случай за Vref = 5 V разделителната способност ще бъде 5V / 256 = 0,0195 V = 9,5 mV.Модулът ADC се включва от бита ADON на регистъра ADCON0, преобразуването започва чрез задаване на бита GO / -DONE на регистъра ADCON0, който се нулира от хардуера след завършване на преобразуването, тоест като проверите този бит, можете да определите края на преобразуването.
Нека да преминем към разглеждането на 10-bit PWM (широчинно-импулсна модулация) в PIC16 микроконтролери. ШИМ се осъществява чрез CCP модула, който е конфигуриран в регистъра CCP1CON и съдържа 16-битов регистър CCPR1, състоящ се от два регистъра CCPR1H и CCPR1L. Сигналът от модула в режим PWM се предава към щифта CCP1 на микроконтролера, който трябва да бъде конфигуриран за изход. За прилагане на ШИМ се използва таймерът TMR2, периодът на ШИМ се задава в регистъра PR2, горните 8 бита от продължителността на импулса се задават в регистъра CCPR1L, долните 2 бита в регистъра CCP1CON(5:4). Блоковата диаграма на PWM модула е показана по-долу:
Когато стойността на таймера TMR2 се сравнява с числото в регистъра PR2 по време на процеса на нарастване, TMR2 се нулира на нула, в същото време щифтът CCP1 се настройва на високо логическо ниво (ако продължителносттаимпулсът в регистрите CCPR1L и CCP1CON е нула, високото логическо ниво не е зададено). Също така в този момент стойността на ширината на импулса от регистрите CCPR1L, CCP1CON се зарежда в регистъра CCPR1H и вътрешния двубитов фиксатор, които формират PWM буфера.Буферирането е необходимо, за да може да се запише нова стойност на продължителността на импулса в регистрите CCPR1L, CCP1CON, без да се изкривява предишната стойност. Битовете в регистър CCPR1L и CCP1CON(5:4) могат да се променят по всяко време, но стойността в регистър CCPR1H не се променя, докато TMR2 и PR2 съвпаднат. В режим PWM регистърът CCPR1H е само за четене.
Таймерът TMR2 и вътрешният двуцифрен брояч образуват условен 10-битов брояч, докато ако TMR2 се увеличава във всеки машинен цикъл с честота Fosc / 4 (със съотношение на предварително скалиране 1: 1), тогава вътрешният двуцифрен брояч се тактова за всеки период на тактовия генератор с честота Fosc, като по този начин се получава условен 10-битов брояч. Когато стойността на CCPR1H и вътрешния двубитов фиксатор се сравнява със стойността на TMR2 и вътрешния двубитов брояч, щифтът на CCP1 става нисък. По-долу можете да видите времедиаграмата на един период на ШИМ:
Периодът на ШИМ може да се изчисли по следната формула от листа с данни:Tshim=(PR2+1)×4×Tosc×(TMR2 коефициент на прескалер)
За мен е по-добре да пренапиша това уравнение в по-удобна форма:
Fpm=Fosc/(4×(PR2+1)×(TMR2 коефициент на прескалер))
Замествайки честотата на тактовия генератор, например, в килохерци, получаваме получената честота на ШИМ в същите единици, тъй като останалите параметри са безразмерни. Листът с данни също съдържа таблица с изчислени стойности на честота и разделителна способност на ШИМ.за тактова честота 20 MHz: Най-удобно е да започнете изчисляването на PWM параметрите, като изберете необходимата резолюция, от която можете да изчислите три възможни комбинации на PWM честота и да изберете най-подходящата.
Нека направим някои изчисления за тактова честота от 4 MHz. Да вземем стойността на разделителната способност на ШИМ равна на 8 бита, за да получим най-високите честоти на ШИМ за дадена честота на тактовия генератор, стойността на продължителността на импулса трябва да бъде заредена в регистрите CCPR1L и CCP1CON с „дясно подравняване“. Това означава, че зареждаме горните 6 бита от продължителността на импулса в битове (5:0) на регистъра CCPR1L (записваме нули в 6-ия и 7-ия бит на CCPR1L) и долните 2 бита от продължителността на импулса в регистъра CCP1CON(5:4), както е показано на фигурата по-долу:
В този случай числената стойност за регистър PR2, която определя периода на ШИМ, ще бъде 0x3F=63. Нека изчислим честотата на ШИМ с коефициента на предскалера TMR2, равен на (1:1):Fshim=4000 kHz/(4×(63+1)×1)=15,625 kHz
За съотношение на предскалер TMR2 (1:4):
Fshim=4000 kHz/(4×(63+1)×4)=3,9 kHz
С коефициент (1:16) получаваме: Fshim=976 Hz.
Използвайки „ляво подравняване“, можете да получите най-ниските честоти на ШИМ за дадена тактова честота, докато стойността на ширината на импулса се зарежда само в регистъра CCPR1L (записваме нули в 5-ия и 4-ия бит на CCP1CON), както е показано на фигурата по-долу: 1:16) получаваме честоти на ШИМ от 3,9 kHz; 976 Hz; 244 Hz. Честотното съпоставяне чрез различно „изравняване“ е възможно само ако разделителната способност на ШИМ е по-малка от 10 бита. По този начин, чрез избиране на необходимата разделителна способност и промяна на честотата на тактовия генератор, коефициентът на прескалера TMR2, прилагайкиразлично "подравняване", можете да изберете различни честоти за ШИМ.
Сега нека разгледаме практическото приложение на ADC и PWM модули, базирани на 8-пинов микроконтролер PIC12F683. Ще регулираме яркостта на един ватов светодиод с помощта на променлив резистор, схемата е показана по-долу:
Както можете да видите от веригата, напрежението се измерва на средния извод на променливия резистор, линията на микроконтролера GP0 / AN0 се използва като аналогов вход на ADC модула. Напрежението на средния щифт на променливия резистор варира от 0 до 5V, ADC използва вътрешното референтно напрежение от захранването Vdd, т.е. 5V. Зададох разделителната способност на ADC и PWM на 8 бита, тази стойност се използва много често в дизайните. Байтът, получен след преобразуването, се прехвърля към PWM модула, сигналът от който се предава от изхода GP2 / CCP1 към портата на транзистора с полеви ефекти, който превключва светодиода.Програмният код е представен по-долу, по принцип трябва само да конфигурирате ADC и PWM и тогава всичко е просто: