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

bychkov77

Участник
  • Публикаций

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

  • Посещение

Репутация

0 Обычный
  1. Помогите разобраться с листом связи

    премного благодарю, помогло, как баран на новые ворота после 10 лет совместной жизни с лайоутом.
  2. Добрый день уважаемые форумчане. Перехожу с Orcad Layout на Orcad PCB editor, на данный момент использую версию 16.5, и литература есть в электронном виде, но застрял на одном моменте: сделал схему, указал футпринты, сделал лист связи, открылся PCB editor, набросал компоненты на плату, "развёл" плату, всё вроде хорошо, хотел изучать дальше. Но, попробовал добавить компонент в схеме и обновить листвязи с платой, появляется ошибка на стадии обновления платы, читаю из netrev.lst: "ERROR: File "777.brd" was locked on date "Wed Mar 26 12:33:28 2014" by user "Àëåêñàíäð" on system "BAAW7". Resolve lock file and re-run netrev." 777.brd - это файл платы (file - properties - loc database - галки нет), почему то он не хочет обновляться, уж и с настройками играл и погуглил... Помогите, может кто знает в чем проблема
  3. Цитата(Xenia @ Mar 29 2012, 12:16) А чего это вы так много WORDов насажали, и все не туда, куда надо? Суть проблемы объединения двух однобайтовых (BYTE) значений в одно двухбайтное (WORD) только в том, чтобы не потерять значение после сдвига buf1 на 8 позиций влево. Т.к. существует риск, что сдвинутые разряды пропадут, не поместившись в BYTE. Чтобы этого не случилось, buf1 приходится СНАЧАЛА растянуть до WORD, и только потом в этом виде сдвигать - тогда уж точно сдвинутым влево битам найдется место. Вот так: *Fs = ((WORD)buf1<<8) | buf2; А у вас buf1 сдвигается влево безо всяких предосторожностей, а то, что потом WORD стоят лесом, уже не поможет, поскольку потерянные разряды не восстановить, преобразуя к более просторной сетке задним числом. Если у вас эта витиеватая конструция все-таки работает нормально, то скорее всего лишь потому, что buf1 определено у вас не как BYTE, а как WORD (к сожалению, в приведенном вами коде декларация buf1 отсутствует). Но если это так, то и подавно ни один из поставленных вами WORD здесь не нужен. да, вы правы, но эту конструкцию мой компилятор проглатывает без вопросов, поэтому и не замарачивался, но спасибо :-) Сделал как посоветовал Ruslan1, разница в показаниях двух АЦП составила 3 дискрета (вместо 60), проверил показания ещё на 2-х таких же АЦП разница в показаниях не превысила 7 дискрет, меня это более чем устраивает, УРА !!! Ещё раз большая благодарность, Руслану! Жаль что с внутренней калибровкой не получилось разобраться, ещё потыкаюсь немного и если ни чего не получится оставлю как есть. Цитата(Tanya @ Mar 29 2012, 12:41) Что-то у Вас не так. Попробуйте нагреть немного... Нужно внимательно читать даташит. Или даже между строк. Вот там написано, что это не для любой скорости должно происходить... Подозреваю, что скорость нужно менять заранее.... Хотя... может быть, что для 16 разрядов... Вот для 24-х меняется. У меня. нагрел феном, точно не знаю на сколько возможно с 25 до 50 градусов, и показания уплыли аж на 20 дискрет, но феном грел всю плату, локально не получилось, Rref тоже грелся, нужно будет это учитывать. У меня коэфициент усиления 1 и 2 в зависимоти от диапазона измерения "For gains of 1, 2, and 4, an internal full-scale calibration can be performed at any update rate" - это из даташита, Татьяна это я читал, но спасибо :-) P.S. Да ещё, резистор 1000 Ом подсоединенный вместо RTD тоже нагревался со всей платой, по этому не удивительно что показания изменились на 20 дискрет
  4. Калибровка второго канала АЦП (Измерение RTD на втором канале у меня) соответственно калибрую только его. Значения калибровочных регистров читаю сразу после окончания калибровок. У меня всегда читается 0x8000 и 0x5555 //************************************************** // Interal Zero and Full-scale calibration //************************************************** void internal__calibration(BYTE Ch) { WORD* Zr; WORD* Fs; if (Ch==1) // Set CS pin of AD9972 {ADC_CS2 = 1; ADC_CS1 = 0; Zr = &Zero_reg1; Fs = &Full_Sc1;} // First ADC is enabled else {ADC_CS2 = 0; ADC_CS1 = 1; Zr = &Zero_reg2; Fs = &Full_Sc2;} // Second ADC is enabled // set IO register Spi2_Write(0x28); // Write to COMMUNICATIONS register for select IO register writing Spi2_Write(0x02); // Write to IO register. Current Source Value = 210uA, // Current Source IEXC1 connected to Pin IOUT1, Current Source IEXC2 connected to Pin IOUT2. //set CONFIG register. Here, select ADC channel for calibration Spi2_Write(0x10); // Write to COMMUNICATIONS register for select CONFIG register writing Spi2_Write(0x11); // Write high byte to CONFIG register Spi2_Write(0x81); // Write low byte to CONFIG register. Channel AIN2(+) – AIN2(–), // Internal Reference Selected, unbuffered mode, Gain 1, Bias voltage connected to AIN2(-) // Zero internal calibration Spi2_Write(0x08); // Write to COMMUNICATIONS register for select MODE register writing Spi2_Write(0x80); // Write high byte to MODE register. Set Zero calibration start bit Spi2_Write(0x0F); // Write low byte to MODE register. Set update rate 4 Hz while(DOUT == 1); // wait while calibration performing // get OFFSET register value Spi2_Write(0x70); // Write to COMMUNICATIONS register for select OFFSET register reading buf1 = Spi2_Read(buffer); // Reading high byte to OFFSET register buf2 = Spi2_Read(buffer); // Reading low byte to OFFSET register *Zr = (WORD) ((WORD) (buf1<<8) | (WORD) (buf2)); // OFFSET register value //Full-scale internal calibration Spi2_Write(0x08); // Write to COMMUNICATIONS register for select MODE register writing Spi2_Write(0xA0); // Write high byte to MODE register. Set Zero calibration start bit Spi2_Write(0x0F); // Write low byte to MODE register. Set update rate 4 Hz while(DOUT == 1); // wait while calibration performing // get FULL SCALE register value Spi2_Write(0x78); // Write to COMMUNICATIONS register for select FULL SCALE register reading buf1 = Spi2_Read(buffer); // Reading high byte to FULL SCALE register buf2 = Spi2_Read(buffer); // Reading low byte to FULL SCALE register *Fs = (WORD) ((WORD) (buf1<<8) | (WORD) (buf2)); // FULL SCALE register value ADC_CS1 = 1; ADC_CS2 = 1; // Disable both CSs }
  5. Ruslan1, Благодарю за совет , сегодня переделаю схему и скорректирую софт для проверки. Я подозревал что это из за несбалансированности источников тока, все таки +-0,5% это много... по результатам отпишусь.
  6. Добрый день! Борюсь с чипом АЦП AD7792. Точнее сразу с двумя, они у меня подключены на один SPI канал процессора и выбираются поочерёдно подачей нуля на CS входы чипов. АЦП используются для измерения сопротивления RTD элементов (PT100 и PT1000). Для теста подключил резистор 1000 Ом 1% на вход первой АЦП, и затем на вход второй АЦП, и снимаю показания. Одна стабильно выдаёт 13022-13023 дискрет, вторая - 13083-13084. Разница 61 дискрет - это много Затем брал другой резистор того же номинала и точности - показания отличаются в пределах точности резистора, и получаем ту же разницу в 61 дискрет между первой и второй АЦП. При подключении резистора 500 Ом поочерёдно, разность между каналами становится 30..31 дискрет, при нулевом сопротивлении оба АЦП выдают нули. Мультипликативная погрешность(отличие между АЦП) на лицо. Исходные условия: - схема подключения термоэлемента - трёхпроводная, взята из даташита. - External reference mode, референтный резистор Rref 4.99 КОм, 0.1%. - Для обоих чипов применён один и тот же программный код. Начал искать. Поменял местами Rref, перепаяв их, всё тоже самое, один в один. Я думаю что хардварным проблемам больше негде быть и вероятно, что-то не так либо с самими АЦП, либо с их настройками. Начал копатья с калибровками. На мой взгляд внутренние калибровки (internal calibrations) могут решить проблему, но тут непонятки с ней. 1. После калибровки значения регистров OFFSET и FULL SCALE (калибровочной пары)не меняются (в них установлены значения по умолчанию - 0x8000 и 0x5555 соответственно). 2. Калибровка никак не влияет на результаты измерений. 3. Мне не понятно что физически означают цифры в калибровочной паре. В даташите читаем, что из результата АЦП, вычитается значание OFFSET и помножается на FULL SCALE. То есть ADC_out = (-OFFSET +ADC_raw ) * FULL_SCALE. В моём случае мы получаем: ADC_out = (-0x8000+13023)*0x5555. Бред какой-та... братья, кто разобрался с калибровкой - нужна ваша помощь!!! 4. Вопрос-утверждение. Int калибровку полезно проводить периодически, раз в 5 мин например, с целью компенсировать возможное изменение температуры самой AD7792. Я прав?