Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 24.04.2013, 08:29   #1
zhaa2
Member
 
Регистрация: 10.03.2013
Возраст: 28
Сообщений: 77
Вес репутации: 100/22
zhaa2 will become famous soon enoughzhaa2 will become famous soon enough
По умолчанию АЦП с DMA dspic33fj128mc804

Господа необходима помошь в подключении модуля ацп, 3-х канального для отцифровки сигналов с датчиков тока. Смысл работы модуля я понял, подключение можно найти в фэмила мануале
Код:
void initAdc1(void)
{
AD1CON1bits.FORM = 3; // Data Output Format: Signed Fraction (Q15 format)
AD1CON1bits.SSRC = 7; // Internal Counter (SAMC) ends sampling and starts conversion
AD1CON1bits.ASAM = 1; // ADC Sample Control: Sampling begins immediately after
// conversion
AD1CON1bits.AD12B = 0; // 10-bit ADC operation
AD1CON2bits.SIMSAM = 0; // Sequential sampling of channels
AD1CON2bits.CHPS = 1; // Converts channels CH0/CH1
AD1CON3bits.ADRC = 0; // ADC Clock is derived from Systems Clock
AD1CON3bits.SAMC = 0; // Auto Sample Time = 0 * TAD
AD1CON3bits.ADCS = 2; // ADC Conversion Clock TAD= TCY* (ADCS + 1) = (1/40M) * 3 = 
// 75 ns (13.3 MHz)
// ADC Conversion Time for 10-bit Tconv = 12 * TAD= 900 ns (1.1 MHz)
AD1CON1bits.ADDMABM = 1; // DMA buffers are built in conversion order mode
AD1CON2bits.SMPI = 0; // SMPI must be 0
//AD1CHS0/AD1CHS123: Analog-to-Digital Input Select Register
AD1CHS0bits.CH0SA = 0; // MUXA +ve input selection (AIN0) for CH0
AD1CHS0bits.CH0NA = 0; // MUXA -ve input selection (VREF-) for CH0
AD1CHS123bits.CH123SA = 0; // MUXA +ve input selection (AIN0) for CH1
AD1CHS123bits.CH123NA = 0; // MUXA -ve input selection (VREF-) for CH1
//AD1PCFGH/AD1PCFGL: Port Configuration Register
AD1PCFGL = 0xFFFF;
AD1PCFGH = 0xFFFF;
AD1PCFGLbits.PCFG0 = 0; // AN0 as Analog Input
IFS0bits.AD1IF = 0; // Clear the Analog-to-Digital interrupt flag bit
IEC0bits.AD1IE = 0; // Do Not Enable Analog-to-Digital interrupt 
AD1CON1bits.ADON = 1; // Turn on the ADC
void initDma0(void)
{
DMA0CONbits.AMODE = 0; // Configure DMA for Register indirect with post increment
DMA0CONbits.MODE = 2; // Configure DMA for Continuous Ping-Pong mode
DMA0PAD = (int)&ADC1BUF0;
DMA0CNT = (NUMSAMP-1);
DMA0REQ = 13;
DMA0STA = __builtin_dmaoffset(BufferA);
DMA0STB = __builtin_dmaoffset(BufferB);
IFS0bits.DMA0IF = 0; //Clear the DMA interrupt flag bit
IEC0bits.DMA0IE = 1; //Set the DMA interrupt enable bit
DMA0CONbits.CHEN = 1;
вопрос стоит в понимании того как из добыть даные которы он цифровал. С этим пока трудности, я понимаю что можно перелопатить кучу страниц на английском, я этим занимаюсь, но на это уйдет куча времени которого сейчас к сожалению не так много как хотелось бы, по этому прошу у вас помощи в этом деле. Заранее спасибо.
zhaa2 вне форума   Ответить с цитированием
Старый 24.04.2013, 09:51   #2
andy1744
Member
 
Регистрация: 28.09.2010
Сообщений: 49
Вес репутации: 102/31
andy1744 will become famous soon enoughandy1744 will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Цитата:
Сообщение от zhaa2 Посмотреть сообщение
вопрос стоит в понимании того как из добыть даные которы он цифровал. С этим пока трудности, я понимаю что можно перелопатить кучу страниц на английском, я этим занимаюсь, но на это уйдет куча времени которого сейчас к сожалению не так много как хотелось бы, по этому прошу у вас помощи в этом деле. Заранее спасибо.
не знаю как вы будете эти данные дальше использовать ,но вы имеете два буфера по очереди заполняемые DMA данными АЦП , один заполняется ,а другой вы должны обработать. Стандартный подход это подать данные из буфера на цифровой фильтр ,а потом децимировать (проредить) до необходимого кол-ва выборок. Ну или для простоты можете , в первом приближении , просто усреднить это будет и фильтр простейший и децимация. Что делать дальше это вам решать. По коду вы получите данные в формате fractional (Q15) , это целочисленный тип данных , но он имеет однозначное соответствие к float в диапазоне от -1 до 1 (для преобразования взять Fract2Float функцию) . В нашем случае источником данных является АЦП , по этому значения будут лежать в диапазоне от 0 до 1 , дальше остается только про масштабировать с учетом значения опорного напряжения АЦП и вы получите напряжение на входе преобразователя.
Ну вот как то так.
andy1744 вне форума   Ответить с цитированием
Старый 24.04.2013, 10:33   #3
zhaa2
Member
 
Регистрация: 10.03.2013
Возраст: 28
Сообщений: 77
Вес репутации: 100/22
zhaa2 will become famous soon enoughzhaa2 will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Спасибо за введение в работу модуля, теперь зная это хотелось бы получить код, желательно на си если есть, мне так проще разобраться что к чему.
zhaa2 вне форума   Ответить с цитированием
Старый 24.04.2013, 11:04   #4
andy1744
Member
 
Регистрация: 28.09.2010
Сообщений: 49
Вес репутации: 102/31
andy1744 will become famous soon enoughandy1744 will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

вы напишите что вам нужно получить , что является источником сигнала для АЦП , конечная частота выборок.
andy1744 вне форума   Ответить с цитированием
Старый 24.04.2013, 11:29   #5
zhaa2
Member
 
Регистрация: 10.03.2013
Возраст: 28
Сообщений: 77
Вес репутации: 100/22
zhaa2 will become famous soon enoughzhaa2 will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Нус, источником сигнала для ацп является датчик тока собраный на основе операционных усилителей и резистора шунта сопротивлением 0.005 Ом. (могу выложить скрины, если это хоть чуть чуть поможет) Это безобразие используется как обратная связь при реализации векторного управления трехфазным двигателем постоянного тока. Вектороное управления реализуется шим. Которая опредлеяется математической моделью, для точности рассчетов математической модели необходимо знание величины тока в каждой из трех обмоток двигателя. мне нужно оцифровывать данные с датчиков тока, дважды за период изменения тока, частота шима 20кГц
zhaa2 вне форума   Ответить с цитированием
Старый 24.04.2013, 11:53   #6
andy1744
Member
 
Регистрация: 28.09.2010
Сообщений: 49
Вес репутации: 102/31
andy1744 will become famous soon enoughandy1744 will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

возьмите пример AN1152 от Микрочип
http://www.microchip.com/stellent/id...pnote=en533730

судя по вашему коду , по моему это и так от туда.
в примере 1 канал 256 sam/ps ,дальше фильтр FIR на 102 отвода , при частоте инструкций Fcy = 40Mhz на вашем камне это займет примерно 40% времени процессора . Исходя из ваших 3 каналов и остальной загрузки системы нужно определиться какие фильтры можно себе позволить . у меня есть где то проект на основе этих примеров там два канала , могу что нибудь наковырять ,скажите что именно , я ведь не знаю как у вас остальная система распланирована , чем вы располагаете по ресурсам , что вызывает трудности.
andy1744 вне форума   Ответить с цитированием
Старый 24.04.2013, 13:17   #7
d-f-m
Senior Member
 
Регистрация: 09.02.2009
Адрес: Недалеко от Пятигорска
Возраст: 46
Сообщений: 611
Вес репутации: 1289/54
d-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud of
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Цитата:
Сообщение от zhaa2 Посмотреть сообщение
но на это уйдет куча времени которого сейчас к сожалению не так много как хотелось бы, по этому прошу у вас помощи в этом деле. Заранее спасибо.
Рабочий пример работы с DMA и ADC для dspic33fj128mc804.
Это проект для мотора BLDC на основе микрочиповского примера переделанный под контроллер с DMA.
В железе работает.
В проекте можно выбрать и контроллер без DMA, есть соотвествующий #define, но в реальном железе не проверялось.
Вложения
Тип файла: zip BldcMC-cpu-1.zip (593.0 Кб, 38 просмотров)

Последний раз редактировалось d-f-m; 24.04.2013 в 13:26.
d-f-m вне форума   Ответить с цитированием
Старый 25.04.2013, 08:46   #8
zhaa2
Member
 
Регистрация: 10.03.2013
Возраст: 28
Сообщений: 77
Вес репутации: 100/22
zhaa2 will become famous soon enoughzhaa2 will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Только сейчас добрался до компьютера с которого можно это скачать) сейчас посмотрю, я так понимаю там полностью код проекта для двигателя BLCD, все рассчеты, преобразования (кларка , Парка) пи регуляторы? верно?
Спасибо большое.
zhaa2 вне форума   Ответить с цитированием
Старый 25.04.2013, 09:38   #9
d-f-m
Senior Member
 
Регистрация: 09.02.2009
Адрес: Недалеко от Пятигорска
Возраст: 46
Сообщений: 611
Вес репутации: 1289/54
d-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud of
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Цитата:
Сообщение от zhaa2 Посмотреть сообщение
Только сейчас добрался до компьютера с которого можно это скачать) сейчас посмотрю, я так понимаю там полностью код проекта для двигателя BLCD, все рассчеты, преобразования (кларка , Парка) пи регуляторы? верно?
Спасибо большое.
Это тестовый проект, но он не доделан до конца, а только чтобы проверить механику, где он планировался работать.
0.5кВт двигатель крутит, пи регулятор работает.
Не доделан контроль тока двигателя и еще куча мелочей.
Проект заморозили на неопределенное время.
d-f-m вне форума   Ответить с цитированием
Старый 25.04.2013, 12:54   #10
zhaa2
Member
 
Регистрация: 10.03.2013
Возраст: 28
Сообщений: 77
Вес репутации: 100/22
zhaa2 will become famous soon enoughzhaa2 will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Я посмортел, вынес очень много интересно. В чера я сам попробовал все это сдлеать, сегодня подкорретировал, примерно стало ясно что и как.
функция включения ацп:
Код:
void Init_ADC()
{
    AD1PCFGL = 0xFFFF; // Настроили порты как вход АЦП

    AD1PCFGLbits.PCFG0 = 0;//Выводы настроены как аналоговые входы
    AD1PCFGLbits.PCFG1 = 0;
    AD1PCFGLbits.PCFG2 = 0;
    AD1PCFGLbits.PCFG3 = 0;
    AD1PCFGLbits.PCFG4 = 0;
    AD1PCFGLbits.PCFG5 = 0;

    TRISAbits.TRISA0=1;//AN0 set the used ADC pins as inputs
    TRISAbits.TRISA1=1;//AN1
    TRISBbits.TRISB1=1;//AN3 
    TRISBbits.TRISB2=1;//AN4
    TRISBbits.TRISB3=1;//AN5 set the used ADC pins as inputs

    AD1CON1bits.ADSIDL= 1;// Прекратить работу модля в режиме ожидания.
    AD1CON1bits.ADDMABM = 1;//Буфер дма записывается в порядке преобразования.
    AD1CON1bits.AD12B = 0;// 10 битный режим, 4-е канала.
    AD1CON1bits.FORM = 0b00;// Выбор выходных данных, целые числа
    AD1CON1bits.SIMSAM= 1;//Образцы CH0, CH1, CH2, CH3 одновременно, когда CHPS<1:0> = 1x
    AD1CON1bits.ASAM = 1;//Отбор проб начинается сразу после последнего преобразования SAMP бит автоматического набора.

//    AD1CHS0bits.CH0NB = 1;//MUX B Channel 0 negative input is VREF-(AN1)
//    AD1CHS0 = 0x0003;	//S/H 0 берет канал AN3
//			//MUX B Channel 0 negative input is VREF-
//    			//MUX B Channel 0 positive input is AN0
//    			//MUX A Channel 0 negative input is VREF-
//    			//MUX A Channel 0 positive input is AN3
//
    /*НАЗНАЧЕНИЕ ВЫводов дляканалов*/
    AD1CHS123bits.CH123NB = 0;// (В)Для каналов  1, 2, 3 Negative Input Vrefl
    AD1CHS123bits.CH123SB = 1;// CH1 positive input is AN3,
                              // CH2 positive input is AN4,
                              // CH3 positive input is AN5
    AD1CHS123bits.CH123NA = 0;// (А)Для каналов  1, 2, 3 Negative Input Vrefl
    AD1CHS123bits.CH123SA = 1;// CH1 positive input is AN3,
                              // CH2 positive input is AN4,
                              // CH3 positive input is AN5

    AD1CSSL = 0x0000; //Пропустить все каналы ANx для сканирования

    AD1CON3 = 0x0001;	//ADC Clock derived from system clock
    			//Autosample time time bits = 0 TAD since PWM is controlling sampling time
    			//TAD = 2*TCY, TAD = 50 nSec
    AD1CON4 =0;		//000  (804) Allocates 1 word of DMA buffer to each analog input IGNORED

    AD1CON2bits.VCFG = 0b011;//VREFH=External VREF+;VREFL=External VREF-;
    AD1CON2bits.CSCNA = 0;// Не проверять выходы.
    AD1CON2bits.CHPS = 11;// Сканировать все каналы(0,1,2,3)
    AD1CON2bits.SMPI = 0b0000;//Увеличивает адрес DMA после завершения каждого образца / конверсионной операции
                              //Прерывания по завершению преобразования для каждого образца / преобразовать последовательность
    AD1CON2bits.BUFM = 0;//Всегда начинается заполнение буфера с адреса 0x0
    AD1CON2bits.ALTS = 0;//Always uses channel input selects for Sample A
    
    IPC3bits.AD1IP = 6;//Преоритет прерывай по АЦП
    IFS0bits.AD1IF = 0;// clear ADC interrupt flag
    
    AD1CON1bits.ADON = 1;	//turn ADC on

}
функция включения ДМА
Код:
void Init_DMA5()
{
    DMA5CONbits.AMODE = 0;//Register Indirect with Post-Increment mode
    DMA5CONbits.MODE = 2; //Continuous, Ping-Pong modes enabled
    DMA5PAD = (volatile unsigned int)&ADC1BUF0;//DMA Channel X Peripheral Address Register
    DMA5CNT = 3;// 4 DMA request
    DMA5REQ = 13;//Select ADC1 as DMA Request source
    DMA5STA = __builtin_dmaoffset(BufferA);
    DMA5STB = __builtin_dmaoffset(BufferB);
    IFS3bits.DMA5IF = 0;//Clear the DMA interrupt flag bit
    IEC3bits.DMA5IE = 1;//Set the DMA interrupt enable bit
    DMA5CONbits.CHEN=1;	//Enable DMA

}
Мне необходимо отцифровывать сигналыприходящие на аналоговые входы AN3, AN4, AN5. так уже определенно схематически, и плата разведена. так же на входы AN0 and AN1 подано опорное нарпяжение, внешнее, это я тожепопробовал учесть в настройке. Хотелось бы что бы значющий человек посмотрел, покритиковал.
Все это я делаю для оцифровки значений токов обмоток.
сейчас занимаюсь обработкой прерываний.
В коде настройки АЦП был установлен бит разрешения прерывания. То есть каждый раз когда у нас АЦп отцифровывает одно значение случается прерываение, и в это прерывании мы должны записать точто получили после преобразования с помошью ДМа впамять, верно? или я что то не так понял.
Следующее меня интересует, при настройки ДМА мы объявляли буфер
Код:
DMA5PAD = (volatile unsigned int)&ADC1BUF0;//DMA Channel X Peripheral Address Register
а в обработке прерываний используются другие значения
Код:
IFS0bits.AD1IF = 0;
	Pot		=ADC1BUF3;	    	//ADC CH0	AN3
	RT		=ADC1BUF0;  		//ADC CH1	AN0
	DCREF	=ADC1BUF1;		    //ADC CH2	AN1
	Imotor	=ADC1BUF2;		    //ADC CH3	AN2
у меня при такой записи компилято ругается сделал так:
Код:
unsigned int IA,IB,IC;
void __attribute__((__interrupt__,no_auto_psv)) _DMA5Interrupt(void)
{
    IFS0bits.AD1IF = 0;
    IA=ADC1BUF0[1];//ADC CH1	AN3
    IB=ADC1BUF0[2];//ADC CH2    AN4
    IC=ADC1BUF0[3];//ADC CH3    AN5
}
вот как то так, если где то туплю сильно, не сердчайте, ид а огромное вам спасибо, хоть чуть чуть внесли понимания всей этой жути в моей голове) но цель это понять полностью и заставить двигатель крутиться))
zhaa2 вне форума   Ответить с цитированием
Старый 25.04.2013, 14:30   #11
grsfan
Member
 
Регистрация: 14.01.2011
Адрес: Ленинград
Сообщений: 89
Вес репутации: 145/30
grsfan will become famous soon enoughgrsfan will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

При работе с АЦП не забывай два момента:
1) Это формат АЦП данных (целое или дробное, т.е правое или левое выравнивание). При работе с ПИД регулятором обычно используют левое выравнивание;
2)То что у тебя 10-битный результат преобразования, это бывает нужно учитывать, например при передачи по юарту.
Цитата:
IFS0bits.AD1IF = 0;
Pot =ADC1BUF3; //ADC CH0 AN3
RT =ADC1BUF0; //ADC CH1 AN0
DCREF =ADC1BUF1; //ADC CH2 AN1
Imotor =ADC1BUF2; //ADC CH3 AN2
про это поподробнее, на что ругается.
И еще, я что-то не увидел разрешения на прерывание по АЦП преобразованию?!
grsfan вне форума   Ответить с цитированием
Старый 25.04.2013, 14:39   #12
zhaa2
Member
 
Регистрация: 10.03.2013
Возраст: 28
Сообщений: 77
Вес репутации: 100/22
zhaa2 will become famous soon enoughzhaa2 will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Записывай так как вы показали, он подчеркивает это дело все красным кроме ADC1BUF0, а именно ADC1BUF1, ADC1BUF2. Но что странно скомпилировал, и не выдал ошибки, но наведя на подчеркиваему строку он выдал "Unable to resolve identifier ADC1BUF2"и"Unable to resolve identifier ADC1BUF1".
Сейчас на данный момент от меня требуется запустить модуль АЦП и ДМА, я записал все данные в регистры настройки как я считаю нужным, подать на какой либо ввод ANx (x=3,4,5) и оценить работатет ли это дело. Вот чем сейчася занимаюсь. в предыдущем сообщении я описал обе функции подключения АЦП и ДМА. Теперь разбираюсь с тем как добыть данные которые он отцифровал. из приведенного примера я понял что это делается прерыванием:
Код:
void __attribute__((__interrupt__,no_auto_psv)) _DMA5Interrupt(void)
{
    IFS0bits.AD1IF = 0;
    IA=ADC1BUF0;//ADC CH1    AN3
    IB=ADC1BUF1;//ADC CH2    AN4
    IC=ADC1BUF2;//ADC CH3    AN5
}
то есть переменные IA,IВ,IС примут значения принятые по соответсвующим вводам?
да, спасибо, действительно пропустил строчку:
Код:
IEC0bits.AD1IE = 1;// enable ADC interrupt

Последний раз редактировалось zhaa2; 25.04.2013 в 14:48.
zhaa2 вне форума   Ответить с цитированием
Старый 25.04.2013, 15:23   #13
grsfan
Member
 
Регистрация: 14.01.2011
Адрес: Ленинград
Сообщений: 89
Вес репутации: 145/30
grsfan will become famous soon enoughgrsfan will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Цитата:
Записывай так как вы показали, он подчеркивает это дело все красным кроме ADC1BUF0, а именно ADC1BUF1, ADC1BUF2. Но что странно скомпилировал, и не выдал ошибки, но наведя на подчеркиваему строку он выдал "Unable to resolve identifier ADC1BUF2"и"Unable to resolve identifier ADC1BUF1".
как я понял с DMA работает только ADC1BUF0 (поэтому он тебе и подчеркнул красным), могу ошибаться так как не работал с DMA модулем. Тебе лучше дождаться ответа у товарища d-f-m, это его код, он тебе лучше расскажет.
Цитата:
IA=ADC1BUF0[1];//ADC CH1 AN3
IB=ADC1BUF0[2];//ADC CH2 AN4
IC=ADC1BUF0[3];//ADC CH3 AN5
еще догадка: так писать нельзя,т.к. в буфер результата АЦП не многоуровневый. В коде у d-f-m есть запись
Код:
        ADC.PotR	=BufferA[0];		//ADC CH0	AN3
	ADC.TermoR	=BufferA[1];		//ADC CH1	AN0
	ADC.DCRefR	=BufferA[2];		//ADC CH2	AN1
	ADC.IMotorR	=BufferA[3];		//ADC CH3	AN2
но BufferA[] это просто буфер неопределенного размера, с элементами типа unsigned int. Другой вопрос как в эти буферы передаются значения АЦП преобразований.
grsfan вне форума   Ответить с цитированием
Старый 25.04.2013, 15:33   #14
zhaa2
Member
 
Регистрация: 10.03.2013
Возраст: 28
Сообщений: 77
Вес репутации: 100/22
zhaa2 will become famous soon enoughzhaa2 will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Вот я тоже задаюсь этими вопроса и очень надеюсь на консультацию товарища d-f-m. Жду его сообщения больше чем смс от банка о зарплате)
zhaa2 вне форума   Ответить с цитированием
Старый 25.04.2013, 16:17   #15
andy1744
Member
 
Регистрация: 28.09.2010
Сообщений: 49
Вес репутации: 102/31
andy1744 will become famous soon enoughandy1744 will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

пока автор молчит.
zhaa2 , вы не обратили внимания на директивы условной компиляции
#if rfPIC_DMA ==
и в приведенном коде получилась смесь варианта работы с DMA и без.

если без DMA тогда
1. нужно прерывание от ADC
2. используете буфер ADCBUF

если с DMA тогда
1. прерывание от DMA
2. и два ping-pong буфера :BufferA , BufferB
andy1744 вне форума   Ответить с цитированием
Старый 25.04.2013, 16:55   #16
zhaa2
Member
 
Регистрация: 10.03.2013
Возраст: 28
Сообщений: 77
Вес репутации: 100/22
zhaa2 will become famous soon enoughzhaa2 will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Я пробовал обратить внимания на эти дерективы, но не настолько силен в знании языка С, для этого проекта изучал с нуля, общаюсь с ним буквально месяца три, так что немогу утверждать что я все занаю и все понимаю)
zhaa2 вне форума   Ответить с цитированием
Старый 25.04.2013, 22:05   #17
d-f-m
Senior Member
 
Регистрация: 09.02.2009
Адрес: Недалеко от Пятигорска
Возраст: 46
Сообщений: 611
Вес репутации: 1289/54
d-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud of
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Цитата:
Сообщение от zhaa2 Посмотреть сообщение
Мне необходимо отцифровывать сигналыприходящие на аналоговые входы AN3, AN4, AN5. так уже определенно схематически, и плата разведена. так же на входы AN0 and AN1 подано опорное нарпяжение, внешнее, это я тожепопробовал учесть в настройке. Хотелось бы что бы значющий человек посмотрел, покритиковал.
Все это я делаю для оцифровки значений токов обмоток.
сейчас занимаюсь обработкой прерываний.
В коде настройки АЦП был установлен бит разрешения прерывания. То есть каждый раз когда у нас АЦп отцифровывает одно значение случается прерываение, и в это прерывании мы должны записать точто получили после преобразования с помошью ДМа впамять, верно? или я что то не так понял.
Следующее меня интересует, при настройки ДМА мы объявляли буфер
Код:
DMA5PAD = (volatile unsigned int)&ADC1BUF0;//DMA Channel X Peripheral Address Register
а в обработке прерываний используются другие значения
Код:
IFS0bits.AD1IF = 0;
    Pot        =ADC1BUF3;            //ADC CH0    AN3
    RT        =ADC1BUF0;          //ADC CH1    AN0
    DCREF    =ADC1BUF1;            //ADC CH2    AN1
    Imotor    =ADC1BUF2;            //ADC CH3    AN2
у меня при такой записи компилято ругается сделал так:
Код:
unsigned int IA,IB,IC;
void __attribute__((__interrupt__,no_auto_psv)) _DMA5Interrupt(void)
{
    IFS0bits.AD1IF = 0;
    IA=ADC1BUF0[1];//ADC CH1    AN3
    IB=ADC1BUF0[2];//ADC CH2    AN4
    IC=ADC1BUF0[3];//ADC CH3    AN5
}
вот как то так, если где то туплю сильно, не сердчайте, ид а огромное вам спасибо, хоть чуть чуть внесли понимания всей этой жути в моей голове) но цель это понять полностью и заставить двигатель крутиться))
В этом контроллере нет буфера АЦП кроме ADC1BUF0 из-за наличия DMA.
Прерывание надо использовать только DMA.
Оно возникает одно на весь пакет.
Прерывание АЦП надо отключить.
Так не пойдет:
Код:
unsigned int IA,IB,IC;
void __attribute__((__interrupt__,no_auto_psv)) _DMA5Interrupt(void)
{
    IFS0bits.AD1IF = 0;
    IA=ADC1BUF0[1];//ADC CH1    AN3
    IB=ADC1BUF0[2];//ADC CH2    AN4
    IC=ADC1BUF0[3];//ADC CH3    AN5
}
Если в контроллере есть DMA, то только через него можно захватывать данные с 4 каналов АЦП одномоментно.
При использовании режима АЦП без DMA захват можно сделать только последовательно, по очереди через ADC1BUF0.
Надо использовать DMA Ping-Pong, как в проекте, который скинул:
Код:
unsigned int IA,IB,IC;
void __attribute__((__interrupt__,no_auto_psv)) _DMA5Interrupt(void)
{
    IFS0bits.AD1IF = 0;
    if(DmaBuffer == 0)
    {
    ??=BufferA[0];        //ADC CH0    AN?
    IA=BufferA[1];        //ADC CH1    AN3
    IB=BufferA[2];        //ADC CH2    AN4
    IC=BufferA[3];        //ADC CH3    AN5
    }
    else
    {
    ??=BufferB[0];        //ADC CH0    AN?
    IA=BufferB[1];        //ADC CH1    AN3
    IB=BufferB[2];        //ADC CH2    AN4
    IC=BufferB[3];        //ADC CH3    AN5
    }
    DmaBuffer ^= 1;

}
Всегда будет захватываться еще и 4 канал, который я отметил вопросом
там можно выбрать любой AN
В проекте код
Код:
#if rfPIC_DMA==0
написан для контролеров без DMA, например dsPIC33FJ32GP204
для dsPIC33FJ128GP804 используется все, что после
Код:
#else
BufferA и BufferB
физически зафиксированны в DMA RAM контроллера, адреса 0x1400, 0x17FE
Для АЦП-DMA применен режим Peripheral Indirect Addressing Mode
Описание на стр 27: 22.6.6 Peripheral Indirect Addressing Mode Section 22. Direct Memory Access (DMA)

Последний раз редактировалось d-f-m; 25.04.2013 в 22:21.
d-f-m вне форума   Ответить с цитированием
Старый 25.04.2013, 22:41   #18
d-f-m
Senior Member
 
Регистрация: 09.02.2009
Адрес: Недалеко от Пятигорска
Возраст: 46
Сообщений: 611
Вес репутации: 1289/54
d-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud of
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Ошибка, пост уже исправить не могу:
используется Register Indirect Addressing.
рисунок Figure 22-11
d-f-m вне форума   Ответить с цитированием
Старый 27.04.2013, 09:45   #19
zhaa2
Member
 
Регистрация: 10.03.2013
Возраст: 28
Сообщений: 77
Вес репутации: 100/22
zhaa2 will become famous soon enoughzhaa2 will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

День добрый, почитал что вы написали, попробовал сделать ка квы сказали, убрал разрешения прерывания по АЦП, а так же канал 0 определил на AN2 теперь код инициализации АЦП выглядит так:
Код:
void Init_ADC1()
{
    AD1PCFGL = 0xFFFF; // Настроили порты как вход АЦП

    AD1PCFGLbits.PCFG0 = 0;//Выводы настроены как аналоговые входы
    AD1PCFGLbits.PCFG1 = 0;
    AD1PCFGLbits.PCFG2 = 0;
    AD1PCFGLbits.PCFG3 = 0;
    AD1PCFGLbits.PCFG4 = 0;
    AD1PCFGLbits.PCFG5 = 0;

    TRISAbits.TRISA0=1;//AN0 set the used ADC pins as inputs
    TRISAbits.TRISA1=1;//AN1
    
    TRISBbits.TRISB0=1;//AN2
    TRISBbits.TRISB1=1;//AN3 
    TRISBbits.TRISB2=1;//AN4
    TRISBbits.TRISB3=1;//AN5 set the used ADC pins as inputs

    AD1CON1bits.ADSIDL= 1;// Прекратить работу модля в режиме ожидания.
    AD1CON1bits.ADDMABM = 1;//Буфер дма записывается в порядке преобразования.
    AD1CON1bits.AD12B = 0;// 10 битный режим, 4-е канала.
    AD1CON1bits.FORM = 0b00;// Выбор выходных данных, целые числа
    AD1CON1bits.SIMSAM= 1;//Образцы CH0, CH1, CH2, CH3 одновременно, когда CHPS<1:0> = 1x
    AD1CON1bits.ASAM = 1;//Отбор проб начинается сразу после последнего преобразования SAMP бит автоматического набора.


    AD1CHS0bits.CH0NB = 1;//Негатив AN1 для СН0(В)
    AD1CHS0bits.CH0NA = 1;//Негатив AN1 для СН0(A)
    AD1CHS0bits.CH0SA = 2;//Позитив AN2 для СН0(В)
    AD1CHS0bits.CH0SA = 2;//Позитив AN2 для СН0(А)

    /*НАЗНАЧЕНИЕ ВЫводов дляканалов*/
    AD1CHS123bits.CH123NB = 0;// (В)Для каналов  1, 2, 3 Negative Input Vrefl
    AD1CHS123bits.CH123SB = 1;// CH1 positive input is AN3,
                              // CH2 positive input is AN4,
                              // CH3 positive input is AN5
    AD1CHS123bits.CH123NA = 0;// (А)Для каналов  1, 2, 3 Negative Input Vrefl
    AD1CHS123bits.CH123SA = 1;// CH1 positive input is AN3,
                              // CH2 positive input is AN4,
                              // CH3 positive input is AN5

    AD1CSSL = 0x0000; //Пропустить все каналы ANx для сканирования

    AD1CON3 = 0x0001;	//ADC Clock derived from system clock
    			//Autosample time time bits = 0 TAD since PWM is controlling sampling time
    			//TAD = 2*TCY, TAD = 50 nSec
    AD1CON4 =0;		//000  (804) Allocates 1 word of DMA buffer to each analog input IGNORED

    AD1CON2bits.VCFG = 0b011;//VREFH=External VREF+;VREFL=External VREF-;
    AD1CON2bits.CSCNA = 0;// Не проверять выходы.
    AD1CON2bits.CHPS = 1;// Сканировать все каналы(0,1,2,3)
    AD1CON2bits.SMPI = 0b0000;//Увеличивает адрес DMA после завершения каждого образца / конверсионной операции
                              //Прерывания по завершению преобразования для каждого образца / преобразовать последовательность
    AD1CON2bits.BUFM = 0;//Всегда начинается заполнение буфера с адреса 0x0
    AD1CON2bits.ALTS = 0;//Always uses channel input selects for Sample A
    
    AD1CON1bits.ADON = 1;	//turn ADC on

}
По моей задумке необходимо что бы Канал 0 захватывал данные с Входа AN2, канал 1 с входа AN3, канал 2 с AN4, канал 3 с AN5. На входы AN1, AN0 подано опорное напряжение в 3,3 вольта:
Код:
AD1CON2bits.VCFG = 0b011;//VREFH=External VREF+;VREFL=External VREF-;
теперь по поводу дма. как вы сказали ранее, я переустановил Register Indirect Addressing с помошью записи в регистр
Код:
DMA5CONbits.AMODE = 0b00;//Register Indirect with Post-Increment mode
и разрешил прерывание по ДМА.
Код инициализации ДМА:
Код:
void Init_DMA5()
{
    DMA5CONbits.AMODE = 0b00;//Register Indirect with Post-Increment mode
    DMA5CONbits.MODE = 2; //Continuous, Ping-Pong modes enabled
    DMA5PAD = (volatile unsigned int)&ADC1BUF0;//DMA Channel X Peripheral Address Register
    DMA5CNT = 3;// 4 DMA request
    DMA5REQ = 13;//Select ADC1 as DMA Request source
    DMA5STA = __builtin_dmaoffset(BufferA);
    DMA5STB = __builtin_dmaoffset(BufferB);
    IFS3bits.DMA5IF = 0;//Clear the DMA interrupt flag bit
    IEC3bits.DMA5IE = 1;//Set the DMA interrupt enable bit
    DMA5CONbits.CHEN=1;	//Enable DMA

}
Вот код обработки прерывания:
Код:
void __attribute__((__interrupt__,no_auto_psv)) _DMA5Interrupt(void)
{
    PORTBbits.RB15=1;
    IFS3bits.DMA5IF = 0;
    if (DmaBuffer ==0)
    {
    IA=BufferA[0];//ADC CH0    AN2
    IB=BufferA[1];//ADC CH1    AN3
    TC=BufferA[2];//ADC CH2    AN4
    ID=BufferA[3];//ADC CH3    AN5
    }
    else
    {
    IA=BufferB[0];//ADC CH0    AN2
    IB=BufferB[1];//ADC CH1    AN3
    TC=BufferB[2];//ADC CH2    AN4
    ID=BufferB[3];//ADC CH3    AN5
    }
    DmaBuffer ^= 1;
    PORTBbits.RB15=0;
}
Здесь я поставил включение порта 15 при входе впрерывание, и отключение при выходе, так сказать для контроля входит он в прерывание или нет?
по моим наблюдениям этого не происходит.

Как я понял ацп работает так:
так как у нас 10 разрядное АЦП, то у нас имеется 1023 деления шкалы, и это 10 разрядов. Максимум шкалы - 3,3 вольта, так как я подаю на ноги AN1 and AN0 3,3 вольта. то есть один шаг шкалы ацп - 3,3В/1023 шагов = 0.003 вольта. 0.033 вольта - это один шаг ацп. по моим рассчета при подаче на ногу 1,5 вольта, у насполучится 1,5/0.003 = 500 делений. и смотря на то что написано в прерывании скажем если я подал 1,5 вольта на ногу AN4 1,5 вольта то в переменную TC запишется 500, верно? или я что то не понимаю. и еще один ньанс, у нас в этом контроллере 16-ти разрядные регистры, а ацп 10 разрядное, то есть в 16-ти разрядном регистре не все будет занято если подать максимум напряжения. и как я понял применяются сдвиги полученных данных по ацп у вас в проекте это указзно так
Код:
ADC.IMotorCIt<<=4;
zhaa2 вне форума   Ответить с цитированием
Старый 27.04.2013, 09:51   #20
zhaa2
Member
 
Регистрация: 10.03.2013
Возраст: 28
Сообщений: 77
Вес репутации: 100/22
zhaa2 will become famous soon enoughzhaa2 will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

вот код проверки на работоспособность АЦП, при подаче 1,5 вольта на вход AN4? все остальные переменные продублированы для того если я что т оперепутал)
Код:
int main()
{
    IA=0;
    IB=0;
    TC=0;
    ID=0;
  PODGOT_OSCILA();
  PODGOT_PWM2();
  Init_ADC1();
  Init_DMA5();
  loop:
  PORTBbits.RB10=1;

  if (TC >= 400 )
  {
      PORTBbits.RB14=1;
  }
  if (IA >= 400 )
  {
      PORTBbits.RB14=1;
  }
  if (IB >= 400 )
  {
      PORTBbits.RB14=1;
  }
  if (ID >= 400 )
  {
      PORTBbits.RB14=1;
  }
  
  goto loop;
  while (1)
  {
      
  }
 

}
функция ШИМ2
Код:
void PODGOT_PWM2()
{
    PWM1CON1bits.PEN1H = 0;//Vivodi nastroeni kak vivodi PWM
    PWM1CON1bits.PEN1L = 0;//---//---
    PWM1CON1bits.PEN2H = 0;//---//---
    PWM1CON1bits.PEN2L = 0;//---//---
    PWM1CON1bits.PEN3H = 0;//---//---
    PWM1CON1bits.PEN3L = 0;//---//---

    TRISBbits.TRISB14=0;
    TRISBbits.TRISB15=0;
    TRISBbits.TRISB10=0;

}
zhaa2 вне форума   Ответить с цитированием
Старый 27.04.2013, 13:01   #21
d-f-m
Senior Member
 
Регистрация: 09.02.2009
Адрес: Недалеко от Пятигорска
Возраст: 46
Сообщений: 611
Вес репутации: 1289/54
d-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud ofd-f-m has much to be proud of
По умолчанию Re: АЦП с DMA dspic33fj128mc804

В регистре AD1CON1 биты 9..8 отвечают куда сдвигать результат
10 = Fractional (D OUT = dddd dddd dd00 0000), т.е. влево
00 = Integer (D OUT = 0000 00dd dddd dddd), т.е. вправо

Я в коде не увидел, где происходит запуск самого преобразования АЦП
За источник запуска отвечает AD1CON1
bit 7-5 SSRC<2:0>:Sample Clock Source Select bits

Если биты в нуле(по умолчанию), то каждый запуск идет вручную сбросом бита SAMP
Код:
SAMP:ADC Sample Enable bit
If SSRC = 000, software can write ‘0’ to end sampling and start conversion.
If SSRC ≠ 000, automatically cleared by hardware to end sampling and start conversion
Для начала можно SAMP использовать:

Пример Example 16-2: Code Sequence for Automatic Sample and Manual Conversion
из Section 16. Analog-to-Digital Converter (ADC)
Его надо вставит внутрь цикла loop: ... goto loop;
Код:
DelayNmSec(100); // Sample for 100 ms
AD1CON1bits.SAMP = 0; // Start converting 
while (!AD1CON1bits.DONE); // Conversion done?
AD1CON1bits.DONE = 0; // Clear conversion done status bit
Я использовал SSRC=011 - Motor Control PWM1 interval ends sampling and starts conversion

Только для отладки можно включить прерывание АЦП и вывести на ногу МК факт прерывания.

Последний раз редактировалось d-f-m; 27.04.2013 в 13:08.
d-f-m вне форума   Ответить с цитированием
Старый 29.04.2013, 06:45   #22
zhaa2
Member
 
Регистрация: 10.03.2013
Возраст: 28
Сообщений: 77
Вес репутации: 100/22
zhaa2 will become famous soon enoughzhaa2 will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Господа всем спасибо) отдельное спасибо господам с никами d-f-m ,grsfan, низкий вам поклон. Это шайтан шаманство сегодня заработало) все 4-е канал как я хотел) теперь дело за оптимизацией) буду дальше бороться) еще раз огромное спасибо
zhaa2 вне форума   Ответить с цитированием
Старый 30.04.2013, 08:28   #23
grsfan
Member
 
Регистрация: 14.01.2011
Адрес: Ленинград
Сообщений: 89
Вес репутации: 145/30
grsfan will become famous soon enoughgrsfan will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Цитата:
Сообщение от zhaa2 Посмотреть сообщение
Господа всем спасибо) отдельное спасибо господам с никами d-f-m ,grsfan, низкий вам поклон. Это шайтан шаманство сегодня заработало) все 4-е канал как я хотел) теперь дело за оптимизацией) буду дальше бороться) еще раз огромное спасибо
главное, чтобы тебе это помогло. Удачи в твоем деле.
grsfan вне форума   Ответить с цитированием
Старый 30.04.2013, 09:21   #24
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 45
Сообщений: 1,497
Вес репутации: 2283/75
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Подскажите плиз - как преобразовывать Q31 в int32 и обратно?
DimaS вне форума   Ответить с цитированием
Старый 01.05.2013, 10:26   #25
zhaa2
Member
 
Регистрация: 10.03.2013
Возраст: 28
Сообщений: 77
Вес репутации: 100/22
zhaa2 will become famous soon enoughzhaa2 will become famous soon enough
По умолчанию Re: АЦП с DMA dspic33fj128mc804

Так, я кое что подзабыл) АЦП и ДМа действительно заработало) датчики тока я настроил, сейчас осталось только разобраться с пи регуляторм. я почитал про них, смысл я понял по поводу реализации, в том примере что вы мне дали, есть, но особо я так и не въехал в эту функцию, мой руководитель едиственное что мне сказал, это что он используется для того что бы преобразовать три синуса токов в две константы. пока я в недоумении что это должно значить.
zhaa2 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите новичку разобраться с АЦП reg33 Вопросы начинающих 43 10.04.2013 22:05
Помогите запустить АЦП PIC18f26k22 retro55 Продукция MICROCHIP 35 13.02.2013 09:46
PIC32: скорость DMA tester Продукция MICROCHIP 41 11.06.2011 18:28
dsPIC33, его модуль АЦП + DMA ? Photon Продукция MICROCHIP 19 24.03.2011 17:37
PIC24H с DMA, модуль АЦП Марк Продукция MICROCHIP 2 11.11.2009 23:12


Часовой пояс GMT +3, время: 10:59.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot