| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| С-заяк търси помощ http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=11553 |
Страница 1 от 1 |
| Автор: | peast [ Пон Юли 15, 2013 10:47 am ] |
| Заглавие: | С-заяк търси помощ |
Опитвам се да премина от Асемблер на С, но не мога да се справя с ADC - симулаторът не помага. Ако ви се занимава, вижте кода - вероятно допускам елементарна грешка, Идеята е ADRESH да се вкара в CCPR1L, като преди това малко се преработи. Осцилоскопът обаче показва, че PWM сигнал има само за 0.1 сек от включване на захранването. Хардуерът е наред. #include <pic.h> #include "delay.h" #include <pic16f684.h> #define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT)) #define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT)) #define flip_bit(ADDRESS,BIT) (ADDRESS ^= (1<<BIT)) #define test_bit(ADDRESS,BIT) (ADDRESS & (1<<BIT)) #define _XTAL_FREQ 8000000 void Init(); __CONFIG ( FOSC_INTOSCIO & WDTE_OFF & MCLRE_OFF & PWRTE_OFF & BOREN_OFF & CP_OFF & CPD_OFF); //volatile char dc; char dc; void main() { Init(); while(1) //Loop Forever { DelayMs(12); ADCON0, GO = 1; while (ADCON0, GO){} dc = ADRESH; // dc = dc << 8; if (dc <= 127){ dc = 127 - dc; clear_bit (PORTA, 4); //pin 3 } else{ dc = dc - 127; set_bit (PORTA, 4); //pin 3 } CCPR1L = dc; } } void Init(){ //OSC IRCF0 = 1; // Used to set intrc speed to 8 MHz IRCF1 = 1; // Used to set intrc speed to 8 MHz IRCF2 = 1; // Used to set intrc speed to 8 MHz //ADC PORTA = 0; TRISA = 0b00000100; // Set RA2 as input - PIN 11 PORTC = 0; TRISC =0; // All outputs CMCON0 = 0x07; // Disable the comparator ADCON0 = 0b00001001; // left, VDD, AN2,ADON ADCON1 = 0b00100000; // 1/32 fosc ANSEL = 0b00000100; // Configure AN2 as analog GIE = 0; //PWM CCP1CON = 0b00101100; // RC5 single PWM ECCPAS = 0; // Auto_shutdown is disabled for now PR2 = 0b00011000; // Sets PWM Period at 20 kHz T2CON = 0b00000101; // TMR2 On with 4 prescale CCPR1L = 0; // Set Duty Cycle to zero TMR2ON = 1; // Start Timer2 return; } |
|
| Автор: | sparkybg [ Пон Юли 15, 2013 12:10 pm ] | |||||||||
| Заглавие: | Re: С-заяк търси помощ | |||||||||
Прочети и ADRESH и ADRESL, независимо че ползваш само едното. Например:
Освен друго, синтаксисът "ADCON0, GO = 0;" ми е малко странен. Сигурен ли си че това се компилира? Запетайката би трябвало да е точка, и да няма празно между нея и "GO". Долу в "while(ADCON0, GO)" - пак така. |
||||||||||
| Автор: | peast [ Вто Юли 16, 2013 2:34 am ] |
| Заглавие: | Re: С-заяк търси помощ |
Dear Sparkybg, Нещо не става... И четенето на ADRESL не помага. Относно синтаксиса май това е защото ползвам HI-TECH - компилира се, а по твоя начин дава грешка - нямало структура. С промяна на честоти и TAD достигнах до някакво преобразуване, но много нелинейно, на единия край на потенциометъра на входа на ADC. Много бях обнадежден, но... ще го мислим пак. Благодаря за отзивчивостта. |
|
| Автор: | Cekins [ Вто Юли 16, 2013 5:11 pm ] |
| Заглавие: | Re: С-заяк търси помощ |
Ха тва за нелинейното е вече друга бира. Прочети си даташита на пик-а дето ползваш в раздела за ацп-то и виж какво изходно съпротивление максимално можеш да сложиш. По принцип (като правило) между 5 и 10 килоома максимум. Ако си сложил 100к е нормално да не мери вярно. Някой от по-новите пикове имат буфер на входа и позволяват по високи съпротивления. |
|
| Автор: | peast [ Вто Юли 16, 2013 6:31 pm ] |
| Заглавие: | Re: С-заяк търси помощ |
10 килоома. |
|
| Автор: | sparkybg [ Вто Юли 16, 2013 6:46 pm ] |
| Заглавие: | Re: С-заяк търси помощ |
Другата причина е да не са нагласени времената на ADC-то. Погледни си в даташита спрямо честотата, на която си пуснал процесора какво Тad трябва да сложиш, и колко Тad периода да сложиш за четене преди да започне да преобразува. Впрочем, а импеданса дето иска PIC32-ката например, ако искаш да правиш 1000 килосемпъла в секунда, беше някъде към 500 ома. Та случаи има всякакви. |
|
| Автор: | Cekins [ Вто Юли 16, 2013 6:55 pm ] |
| Заглавие: | Re: С-заяк търси помощ |
Ами то за потенциометър с по-старите пикове може и с 1 мегаом да стане - като сметнеш колко време ще се зарежда кондензатора и си го задържаш толкова време включен към S/H схемата. Ама пък 2-3 килоома пот не е кой знае колко голям товар 2-3 милиампера не са кой знае кво ако не си на някво батерийно захранване дето се цедят микроамперите... |
|
| Автор: | peast [ Пет Юли 19, 2013 10:10 am ] |
| Заглавие: | Re: С-заяк търси помощ |
След няколкодневно зубрене на ADC работите се пооправиха и съоръжението работи. Остана само един проблем. ADRESH се вкарва в CPPR1L, за да се управлява DC. При промяна на DC се променя и амплитудата на PWM сигнала - намалява при увеличаване на DC до изчезване към 85%. Засега не мога да си обясня това, вероятно от неточна настройка на PWM регистрите. Ще се учи още. Благодаря за съдействието. |
|
| Автор: | Cekins [ Пет Юли 19, 2013 10:35 am ] |
| Заглавие: | Re: С-заяк търси помощ |
Бит 4 и 5 в CCP1CON са най-младшите два бита на пвм-дютито. По принцип ако не ги ползваш трябва да са 0. Освен това PWM-a ще работи нормално (така както си го настроил) при вход от ацп-то десетично от 4 до 96 от там на сетне ще почне да се променя пак от 0. Ако държиш PWM-а да ти е на 20 kHz PR2 трябва да е 100 (десетично), прескалера и постскалера на таймер2 на 0. Резултата от АЦП-то трябва да се приравни на 400 - да се раздели на 2.56 - по лесно става ако се умножи по 100 и се раздели на 256 ако имаш 32 битова целочислена аритметика, и то деленето е просто в случая - маха се младшия байт на резултата. После двата младши бита от крайния резултат се вкарват в съответните битове в CCP1CON а останалите в CCPR1L. |
|
| Автор: | peast [ Нед Юли 21, 2013 3:16 pm ] |
| Заглавие: | Re: С-заяк търси помощ |
Не мога да схвана защо при увеличаване на DC амплитудата на PWM пада и към 85% сигналът изчезва. Вижте картинката. Канал 1 е вързан за изхода на PWM, а канал 2 за входа на ADC. Също и напрежението на входа на ADC се движи под 2 v, докато при изваден от цокъла контролер си е нормално - 0 - 5v. Смених PIC-a, но нямаше ефект
|
|
| Автор: | Cekins [ Нед Юли 21, 2013 3:34 pm ] |
| Заглавие: | Re: С-заяк търси помощ |
Ами не знам какво разбираш под амплитуда? На изхода на PWM-а трябва да имаш 1-0 със някакво запълване. Това че размаха ти е 2 волта на него изход въобще не е нормално. АЦП-то ти може да се държи така странно ако го цъкаш много бързо и потенциометъра ти е голям - това за което говорихме по-горе. Там имаш кондензатор който трябва да се зареди. Всъщност всичките ти проблеми са хардуерни + непознаване на принципа на работа на двата модула АЦП и ПВМ. Прочети ги още няколко пъти в даташита и виж какво съм ти писал за ПВМ-а. ПВМ-а работи като сравнява CCPR1L с таймер 2 - когато този регистър стане равен на таймер 2 изхода се сменя (дали ще е надолу или нагоре си зависи от пвм-а и от настройките). А регистъра PR2 ти определя до колко да ти брои таймер 2 преди да се нулира. Затова ако искаш да ти работи нормално в CCPR1L НЕ ТРЯБВА да слагаш стойност по голяма от PR2 - това ще доведе до неправилна работа на PWM-а. |
|
| Автор: | peast [ Нед Юли 21, 2013 5:28 pm ] |
| Заглавие: | Re: С-заяк търси помощ |
Под малка амплитуда на сигнала разбирам това, че импулсите се движат от 0v за лог.нула до 2v за лог.1. По-нагоре не. За това, че съм тъпак, си прав. Оказа се, че входа на ADC e запоен за съседното краче. Сега всичко прие нормален вид. Благодаря за всичко. Край на темата. |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|