Перейти к содержанию
    

maxim_P

Участник
  • Постов

    39
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные maxim_P


  1. При малых токах заряд также накапливается (а куда же ему деваться?), только выходной уровень будет другим.

    Вам нужно либо менять коэффициент усиления входного каскада (переключать резистор в ОС), либо по-другому обрабатывать выход.

    Может , АРУ поставить?

    А если заряд совсем не копится, значит большая утечка на конденсаторе.

     

    Не хотелось бы делать переключение резисторов. При малых токах он конечно будет заряжаться на микровольты, но мне еще надо отображать на индикаторе как-то этот заряд. Я 64 раза в секунду измеряю величину напряжения на конденсаторе с помощью АЦП, а потом суммирую эти значения и вывожу на индикатор суммарное значение напряжений за секунду. Сотни микроампер еще "видно", а вот ниже уже практически никакого изменения. Придется, наверное, более сложную схему делать

     

    DDC112 и иже с ними... Там же IVC102 и др...

    А за какое время нужно помнить, копить?

     

    Накопление заряда - миллисекунды. А помнить - пока напряжение на конденсаторе не достигнет порогового

  2. Вообще-то, если включить фотодиод в режиме генератора тока- то тогда подключайте его вместо вх. резистора к инвертирующему интегратору на прецизионном ОУ- и все. Только ОУ должен быть прецизионным и в области пост. тока, и широкополосным, т.е. быстродействующим, если импульсы тока короткие.

     

    Я как раз и подключаю к инвертирующему усилителю - интегратору. Получаю импульсы напряжения. Дело в том, что необходимо измерять токи в большом динамическом диапозоне (от единиц пикоампер до десятков наноампер). Получается, что при малых токах накопления заряда не будет, а при больших токах все в порядке. Проблема состоит имеено в том, чтобы накапливать заряд при малых токах

    (пикоамперы)

  3. А операционник уже никак не применить?

    Вообще я не понимаю, чего хочет автор этого сочинения.

    Хоть бы объяснил по человечески, ну или рисунок накидал, чё на входе и чё хочется на выходе. А то сиди гадай...

    [/quote

     

    Вообще нужно измерять дозу радиации. Конкретнее, ток фотодиода. Импульсы тока разные по амплитуде и длительности,соответственно доза тоже будет различной. поэтому нужно накапливать заряд до определенного уровня напряжения, который соответствует определенной дозе. Сначала импульсы тока преобразуются в импульсы напряжения с помощью операционника, а затем должно идти накопление заряда

    untitled.bmp

  4. А может,... интегратор нам поможет?

     

    Пробую с интегратором. Длительность входного импульса единицы миллисекунд. И если амплитуда импульса десятки милливольт, то конденсатор практически не заряжается. Необходимо, чтобы конденсатор "улавливал" такие импульсы

  5. не понял...

    [/quot

     

    Конденсатор должен заряжаться напряжением входного импульса. Амплитуда импульса разная (от единиц милливольт до единиц вольт). То есть чем больше амплитуда, тем, соответственно, быстрее должен заряжаться конденсатор. Причем необходимо, чтобы конденсатор при этом накапливал заряд. При достижении заряда конденсатора порогового значения (например 2В), конденсатор разрядить. Есть АЦП, которым можно измерить напряжение на конденсаторе и разрядить его. Основная проблема в накоплении заряда.

  6. Подскажите, пожалуйста, кто-нибудь простенькую схему накопления заряда на конденсаторе. скорость заряда должна зависеть от входного импульсного сигнала. После снятия импульса, конденсатор должен удерживать заряд.

  7. Разобрался с регистром статуса DataFlash. Все работает. Большое Спасибо.

     

    По поводу записи/чтения возникли еще вопросы. Необходимо передавать

    массив, состоящий из 1024 значений, причем для каждого значения нужно

    выделить 2 байта. Получается, чтобы записать этот массив, понадобится 4

    страницы. Страницы могут быть двух форматов ( 528 и 512 байт). Я использую

    512В формат страницы. Каждый раз

    после записи, я инкрементирую номер страницы на 1. При чтениии, значения

    массива распределены не по порядку. Если инкрементировать на 2, то все

    становится на свои места. С чем это связано? Как DataFlash определяет, какой

    формат страницы используется?

  8. Проверка записи - чтение и верификация после записи, разве не так?

    Я очень бегло и "по диагонали" глянул. С ходу пока такие замечания.

    1. если вы не работаете по прерыванию от передатчика, то зачем его разрешаете? Переход по вектору USART0TX_VECTOR вызывает сброс флага UTXIFG0, а вы его еще и в процедуре опрашиваете.

    2. у вас нет процедуры проверки флага BUSY в регистре статуса DataFlash. Его нужно опрашивать после записи, перед тем как читать DataFlash собрались. Без опроса BUSY можно только с буфером (ОЗУ) DataFlash работать.

    3. В прерывании от приемника не контролируется переполнение буфера (т.е. значение счетчика i2).

    P.S. надо бы еще на количество фиктивных байт при записи команды обратить внимание, но это уж вы сами посчитайте :)

    Спасибо за замечания. Я немного откорректировал программу. Внес кое-какие изменения. Поставил задержки после записи/чтения DataFlash. Убрал прерывание по передачи. Теперь DataFlash пишет и читает. По поводу Busy не понятно. У меня микросхема без вывода RDY/BUSY. Как этот флаг проверять?

  9. Приведите полный листинг программы, а то непонятно как (правильно ли?) вы инициализировали USART и разрешили ли прерывания от приемника USART?

    P.S. только исходник приложите к своему сообщению как файл. Не стоит такой большой кусок кода копи-пастить его в тело сообщения и тем паче без оформления его тегами code.

    P.P.S. если как-то поможет, от вот примеры функций из мой библиотеки для работы с DataFlash AT45. Вроде библиотека рабочая, но с особым пристрастием я ее не тестировал. :)

     

     

    вот осходник. Идентификационный код читается без проблем. Можно ли как-нибудь проверить

    записаны данные или нет?

     

    DataFlash.zip

  10. #pragma vector=USART0RX_VECTOR

    __interrupt void SPI0_rx (void)

    {

    _NOP();

    akn[i2] = RXBUF0;

    i2++;

    }

     

    #pragma vector=USART0TX_VECTOR

    __interrupt void SPI0_tx (void)

    {

    _NOP();

    }

    void readAT45DX()

    {

    P3OUT &= ~ 0x01;

    while ((U0TCTL&TXEPT)!= TXEPT);

    TXBUF0 = 0x03; // îòïðàâèòü êîììàíäó

    while ((U0TCTL&TXEPT)!= TXEPT);

    TXBUF0 = 0x00; // îòïðàâèòü àäðåñ

    while ((U0TCTL&TXEPT)!= TXEPT);

    TXBUF0 = 0x02;

    while ((U0TCTL&TXEPT)!= TXEPT);

    TXBUF0 = 0x01;

    while ((U0TCTL&TXEPT)!= TXEPT);

    for (i1 = 0; i1 != 10; i1++)

    {

    while ((U0TCTL&TXEPT)!= TXEPT);

    TXBUF0 = 0x00;

    }

    P3OUT |= 0x01;

    }

     

    void write_buf_1_AT45DX()

    {

    P3OUT &= ~ 0x01;

    while ((U0TCTL&TXEPT)!= TXEPT);

    TXBUF0 = 0x84; // îòïðàâèòü êîììàíäó

    while ((U0TCTL&TXEPT)!= TXEPT);

    TXBUF0 = 0x00; // îòïðàâèòü àäðåñ

    while ((U0TCTL&TXEPT)!= TXEPT);

    TXBUF0 = 0x00;

    while ((U0TCTL&TXEPT)!= TXEPT);

    TXBUF0 = 0x01;

    while ((U0TCTL&TXEPT)!= TXEPT);

    for (i1 = 0; i1 != 10; i1++)

    {

    U0TXBUF = P[i1];

    while ((U0TCTL&TXEPT)!= TXEPT);

    _NOP();

    _NOP();

    }

    P3OUT |= 0x01;

    }

     

    void write_mem_AT45DX()

    {

    P3OUT &= ~ 0x01;

    while ((U0TCTL&TXEPT)!= TXEPT);

    TXBUF0 = 0x83; // îòïðàâèòü êîììàíäó

    while ((U0TCTL&TXEPT)!= TXEPT);

    TXBUF0 = 0x00; // îòïðàâèòü àäðåñ

    while ((U0TCTL&TXEPT)!= TXEPT);

    TXBUF0 = 0x02;

    while ((U0TCTL&TXEPT)!= TXEPT);

    TXBUF0 = 0x00;

    while ((U0TCTL&TXEPT)!= TXEPT);

    P3OUT |= 0x01;

    }

×
×
  • Создать...