реклама на сайте
подробности

 
 
> dsPIC и внутренний АЦП, не происходит преобразование
Ambasador
сообщение Apr 17 2011, 18:21
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 17-04-11
Пользователь №: 64 433



Решил в DSPIC33FJ32GP204 изучить АЦП. Хотел изменяя сопротивление потенциометра с помощью поочерёдного загорания светодиодов (4 штуки) иметь представление о текущем уровне сигнала. Вот текст программы
Код
#include "p33Fxxxx.h"
_FOSCSEL(0x02);
_FOSC(0xE2);
int pot=0b0000000000;
int READ_ADC (void)
    {
    AD1CHS123bits.CH123SA=0;          
    AD1CON1bits.SAMP = 1;      

    while (!AD1CON1bits.DONE);  
    return ADC1BUF0;            
    }

int main(void)
{
PORTA=0;
LATA=1;
TRISA=0b1;
PORTC=0;
LATC=0;
TRISC=0b100;
PORTB=0;
LATB=0;
TRISB=0;
AD1PCFGL=0b1111111111110;
_AD12B=0;
AD1CON2bits.VCFG=0b011;
AD1CON2bits.CHPS=0b11;
AD1CON1bits.SSRC=0b111;
AD1CON1bits.ASAM=0b1;
AD1CON2bits.SMPI =0b0000;
AD1CON2bits.CSCNA =0b0;
AD1CON3bits.SAMC = 0b11111;
AD1CON3bits.ADCS=0b00000001;
//AD1CON3 = 0b0001111100000001
AD1CHS0=0b0;
AD1CSSL=0b1;
AD1CON1bits.FORM=0b00;
//AD1CHS123bitsCH123SA=0;
_AD1IE=1;
_AD1IF=0;
AD1CON1bits.ADON=0b1;

while(1)
{

if (pot<=0b11111111)
    _RB3=1;
else
        if(pot>0b11111111&&pot<=0b111111111)
            {_RB3=1;
            _RB2=1;}
        else
            if(pot>0b111111111&&pot<=0b1011111111)
                {_RB3=1;
                _RB2=1;
                _RB1=1;}
            else
                if (pot>0b1011111111)
                {_RB3=1;
                _RB2=1;
                _RB1=1;
                _RB0=1;}
}
}
void __attribute__((__interrupt__,auto_psv)) _ADC1Interrupt(void)
{

          READ_ADC();
pot=ADC1BUF0;
        _AD1IF = 0;
}

но почему-то всегда горят все 4 вне зависимости от изменения... помогите разобраться в чём дело.. если кому надо - могу схему в протеусе сбросить...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Слесарь
сообщение Apr 17 2011, 19:37
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484



Код для аналогово переключателя программ в моей СМА.
Может поможет

Код
ADCON0 = 0x01;
ADCON1 = 0x0D; // AN0 AN1
ADCON2 = 0x82; //


unsigned char GetProg()
{
    unsigned int vol = 0;
    ADCON0 = 0x05; // AN1 вход переключателя программ
    vol = getVoltage();

    if( vol >= 40 && vol < 120 ) return 1; // 67
    if( vol >= 120 && vol < 220 ) return 2; // 178
    if( vol >= 220 && vol < 310 ) return 3; // 274
    if( vol >= 310 && vol < 386 ) return 4; // 351
    if( vol >= 386 && vol < 450 ) return 5; // 422
    if( vol >= 450 && vol < 510 ) return 6; // 487
    if( vol >= 510 && vol < 570 ) return 7; // 543
    if( vol >= 570 && vol < 630 ) return 8; // 604
    if( vol >= 630 && vol < 685 ) return 9; // 661
    if( vol >= 685 && vol < 735 ) return 10; // 714
    if( vol >= 735 && vol < 785 ) return 11; // 767
    if( vol >= 785 && vol < 845 ) return 12; // 816
    if( vol >= 845 && vol < 905 ) return 13; // 871
    if( vol >= 905 && vol < 955 ) return 14; // 927
    if( vol >= 955 && vol < 1010 ) return 15; // 991

    return 0;
}


unsigned int getVoltage(void)
{
    ADCON0bits.GO = 1;
    while( ADCON0bits.GO );
    return  ( (int)ADRESH << 8 ) + ADRESL;    
}


Сообщение отредактировал Слесарь - Apr 17 2011, 20:02
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 00:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016