Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2021-июл-24 03:56

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 23 сообщения ]  На страницу 1 2 »
Автор Сообщение
 Заголовок сообщения: Работа с АЦП
СообщениеДобавлено: 2012-мар-20 15:20 
Не в сети

Зарегистрирован: 2009-июн-01 16:25
Сообщения: 45
Откуда: РИРВ
Добрался потихоньку до работы с АЦП. Нужна помощь в решении задачи:
Частота системной шины - 50МГЦ. Требуется взять 2 отсчета АЦП на расстоянии 125 тактов(dt) системной шины, с периодом(T) 500...50000 тактов ( дискрет = 1 такту).
Задача фоновая, указанные цифры должны соблюдаться с абсолютной точностью. Константная групповая задержка(на преобразование) значения не имеет.

Возможно ли решение данной задачи на МК первых ревизий?
Возможно ли решить данную задачу на серийных образцах?


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-мар-21 10:20 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 762
Откуда: г. Санкт-Петербург
vetal писал(а):
Добрался потихоньку до работы с АЦП. Нужна помощь в решении задачи:
Частота системной шины - 50МГЦ. Требуется взять 2 отсчета АЦП на расстоянии 125 тактов(dt) системной шины, с периодом(T) 500...50000 тактов ( дискрет = 1 такту).
Задача фоновая, указанные цифры должны соблюдаться с абсолютной точностью. Константная групповая задержка(на преобразование) значения не имеет.

Возможно ли решение данной задачи на МК первых ревизий?
Возможно ли решить данную задачу на серийных образцах?
Посчитал возможным выразить свое мнение по этому вопросу:
В связи с тем, что "...Для начала перобразования необходимо записать 1 в бит Cfg_REG_GO", а сделать это можно только программно, вам вряд ли удастся соблюсти указанные цифры с абсолютной точностью.
С уважением, Василий.


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-мар-21 11:24 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1318
Откуда: АО "ПКК Миландр"
vetal писал(а):
Добрался потихоньку до работы с АЦП. Нужна помощь в решении задачи:
Частота системной шины - 50МГЦ. Требуется взять 2 отсчета АЦП на расстоянии 125 тактов(dt) системной шины, с периодом(T) 500...50000 тактов ( дискрет = 1 такту).
Задача фоновая, указанные цифры должны соблюдаться с абсолютной точностью. Константная групповая задержка(на преобразование) значения не имеет.

Возможно ли решение данной задачи на МК первых ревизий?
Возможно ли решить данную задачу на серийных образцах?
В явном виде решения нет.
Возможно получится это реализовать на базе синхронного запуска двух АЦП (обеспечения dt = 125 тактов). Для обеспечения периода Т скорее всего придется набирать массив с помощью DMA и затем программно вычислять элемент в массиве соответствующий 500....50000 такту. Для обеспечения дискрета = 1 такту, использовать дополнительную задержку перед началом преобразования в купе с перерасчетом номера элемента в массиве.

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


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-апр-16 14:39 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 532
Доброго времени суток.
Спрошу здесь, потом искать будет легче.
Процессор 1986ВЕ91Т ревизия 1202
Питание процессора 3,3В (аналоговая и цифровая часть)
На выводы PORTD0-PORTD1 заведена опора 3.0В (REF193)
Тактирование от кварца 12 МГц, PLL повышает частоту до 78 МГц.
CPU1_CLK = 12/2 = 6 МГц
CPU2_CLK = 6*13 = 78 МГц
CPU3_CLK = HCLK = 78 МГц
настраиваю АЦП для работы от внешнего источника опорного напряжения.
Но все измерения получаются от внутреннего.
Например на входе 0,1В АЦП выдает значение в диапазоне 0x7A-0x80 (что соответствует измерению от внутреннего источника опорного напряжения), хотя по расчетам должно быть 0x88.
При увеличении входного напряжения результат измерений также соответствует опоре в 3.3В.
В чем может быть ошибка.
Вот код инициализации АЦП и порта D
void ADC_HW_Init(void)
{ ADC_InitTypeDef ADC_InitStruct; 
  ADCx_InitTypeDef ADCx_InitStruct;
  
  RST_CLK_PCLKcmd( RST_CLK_PCLK_ADC, ENABLE); // 
  RST_CLK_ADCclkSelection(RST_CLK_ADCclkCPU_C1); // 
  RST_CLK_ADCclkPrescaler(RST_CLK_ADCclkDIV1); // 
  RST_CLK_ADCclkEnable(ENABLE);

  ADC_DeInit();
  ADC_InitStruct.ADC_SynchronousMode = ADC_SyncMode_Independent;//
  ADC_InitStruct.ADC_StartDelay      = 0; //
  ADC_InitStruct.ADC_TempSensor      = ADC_TEMP_SENSOR_Disable;//
  ADC_InitStruct.ADC_TempSensorAmplifier = ADC_TEMP_SENSOR_AMPLIFIER_Disable;
  ADC_InitStruct.ADC_TempSensorConversion = ADC_TEMP_SENSOR_CONVERSION_Disable;
  ADC_InitStruct.ADC_IntVRefConversion = ADC_VREF_CONVERSION_Disable;
  ADC_InitStruct.ADC_IntVRefTrimming = 0;
  
  ADC_Init(&ADC_InitStruct);

  ADCx_InitStruct.ADC_ClockSource = ADC_CLOCK_SOURCE_ADC ; //
  ADCx_InitStruct.ADC_SamplingMode = ADC_SAMPLING_MODE_SINGLE_CONV; //
  ADCx_InitStruct.ADC_ChannelSwitching = ADC_CH_SWITCHING_Disable;  //
  ADCx_InitStruct.ADC_ChannelNumber = ADC_CH_ADC2; //
  ADCx_InitStruct.ADC_Channels = 0;//
  ADCx_InitStruct.ADC_LevelControl = ADC_LEVEL_CONTROL_Disable; //
  ADCx_InitStruct.ADC_LowLevel = 0; //
  ADCx_InitStruct.ADC_HighLevel = 0; //
  ADCx_InitStruct.ADC_VRefSource = ADC_VREF_SOURCE_EXTERNAL; //
  ADCx_InitStruct.ADC_IntVRefSource = ADC_INT_VREF_SOURCE_INEXACT; //
  ADCx_InitStruct.ADC_Prescaler = ADC_CLK_div_8; //
  ADCx_InitStruct.ADC_DelayGo = 7; //
  
  ADC1_Init(&ADCx_InitStruct);
//  ADCx_InitStruct.ADC_ChannelNumber = ADC_CH_ADC3; //
  ADC2_Init(&ADCx_InitStruct);
  
  ADC1_Cmd(ENABLE);
  ADC2_Cmd(ENABLE);
 }
void PORT_HW_INIT(void)
{
  PORT_InitStruct.PORT_Pin = PORT_Pin_All; 
  PORT_InitStruct.PORT_OE  = PORT_OE_IN; 
  PORT_InitStruct.PORT_PULL_UP = PORT_PULL_UP_OFF; 
  PORT_InitStruct.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF; 
  PORT_InitStruct.PORT_PD_SHM = PORT_PD_SHM_ON; 
  PORT_InitStruct.PORT_PD = PORT_PD_OPEN ; 
  PORT_InitStruct.PORT_GFEN = PORT_GFEN_OFF; 
  PORT_InitStruct.PORT_FUNC = PORT_FUNC_PORT; 
  PORT_InitStruct.PORT_SPEED = PORT_OUTPUT_OFF; 
  PORT_InitStruct.PORT_MODE = PORT_MODE_ANALOG; 
  PORT_Init (MDR_PORTD, &PORT_InitStruct);
}
Вот кусок программы по обработке значений АЦП
void ADC_Cycle (void)
{
  // АЦП2 опрашивается аналогичным образом
  if (MDR_ADC->ADC1_STATUS & ADC_STATUS_FLG_REG_EOCIF)
    { Ch1_Select = (MDR_ADC->ADC1_RESULT>>16) & 0x1F;
      ADCValueBufer[Ch1_Select - 2] = MDR_ADC->ADC1_RESULT & 0xFFF; 
      Ch1_Select++;
      if (Ch1_Select>=9) Ch1_Select = 2;
      MDR_ADC->ADC1_CFG = (MDR_ADC->ADC1_CFG & ~ADC1_CFG_REG_CHS_Msk) | (Ch1_Select<<ADC1_CFG_REG_CHS_Pos) | ADC1_CFG_REG_GO; 
     }
 }


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-апр-16 16:06 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1318
Откуда: АО "ПКК Миландр"
редактор писал(а):
Доброго времени суток.
Спрошу здесь, потом искать будет легче.
Процессор 1986ВЕ91Т ревизия 1202
Питание процессора 3,3В (аналоговая и цифровая часть)
На выводы PORTD0-PORTD1 заведена опора 3.0В (REF193)
Тактирование от кварца 12 МГц, PLL повышает частоту до 78 МГц.
CPU1_CLK = 12/2 = 6 МГц
CPU2_CLK = 6*13 = 78 МГц
CPU3_CLK = HCLK = 78 МГц
настраиваю АЦП для работы от внешнего источника опорного напряжения.
Но все измерения получаются от внутреннего.
Например на входе 0,1В АЦП выдает значение в диапазоне 0x7A-0x80 (что соответствует измерению от внутреннего источника опорного напряжения), хотя по расчетам должно быть 0x88.
При увеличении входного напряжения результат измерений также соответствует опоре в 3.3В.
В чем может быть ошибка.
Вот код инициализации АЦП и порта D
void ADC_HW_Init(void)
{ ADC_InitTypeDef ADC_InitStruct; 
  ADCx_InitTypeDef ADCx_InitStruct;
  
  RST_CLK_PCLKcmd( RST_CLK_PCLK_ADC, ENABLE); // 
  RST_CLK_ADCclkSelection(RST_CLK_ADCclkCPU_C1); // 
  RST_CLK_ADCclkPrescaler(RST_CLK_ADCclkDIV1); // 
  RST_CLK_ADCclkEnable(ENABLE);

  ADC_DeInit();
  ADC_InitStruct.ADC_SynchronousMode = ADC_SyncMode_Independent;//
  ADC_InitStruct.ADC_StartDelay      = 0; //
  ADC_InitStruct.ADC_TempSensor      = ADC_TEMP_SENSOR_Disable;//
  ADC_InitStruct.ADC_TempSensorAmplifier = ADC_TEMP_SENSOR_AMPLIFIER_Disable;
  ADC_InitStruct.ADC_TempSensorConversion = ADC_TEMP_SENSOR_CONVERSION_Disable;
  ADC_InitStruct.ADC_IntVRefConversion = ADC_VREF_CONVERSION_Disable;
  ADC_InitStruct.ADC_IntVRefTrimming = 0;
  
  ADC_Init(&ADC_InitStruct);

  ADCx_InitStruct.ADC_ClockSource = ADC_CLOCK_SOURCE_ADC ; //
  ADCx_InitStruct.ADC_SamplingMode = ADC_SAMPLING_MODE_SINGLE_CONV; //
  ADCx_InitStruct.ADC_ChannelSwitching = ADC_CH_SWITCHING_Disable;  //
  ADCx_InitStruct.ADC_ChannelNumber = ADC_CH_ADC2; //
  ADCx_InitStruct.ADC_Channels = 0;//
  ADCx_InitStruct.ADC_LevelControl = ADC_LEVEL_CONTROL_Disable; //
  ADCx_InitStruct.ADC_LowLevel = 0; //
  ADCx_InitStruct.ADC_HighLevel = 0; //
  ADCx_InitStruct.ADC_VRefSource = ADC_VREF_SOURCE_EXTERNAL; //
  ADCx_InitStruct.ADC_IntVRefSource = ADC_INT_VREF_SOURCE_INEXACT; //
  ADCx_InitStruct.ADC_Prescaler = ADC_CLK_div_8; //
  ADCx_InitStruct.ADC_DelayGo = 7; //
  
  ADC1_Init(&ADCx_InitStruct);
//  ADCx_InitStruct.ADC_ChannelNumber = ADC_CH_ADC3; //
  ADC2_Init(&ADCx_InitStruct);
  
  ADC1_Cmd(ENABLE);
  ADC2_Cmd(ENABLE);
 }
void PORT_HW_INIT(void)
{
  PORT_InitStruct.PORT_Pin = PORT_Pin_All; 
  PORT_InitStruct.PORT_OE  = PORT_OE_IN; 
  PORT_InitStruct.PORT_PULL_UP = PORT_PULL_UP_OFF; 
  PORT_InitStruct.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF; 
  PORT_InitStruct.PORT_PD_SHM = PORT_PD_SHM_ON; 
  PORT_InitStruct.PORT_PD = PORT_PD_OPEN ; 
  PORT_InitStruct.PORT_GFEN = PORT_GFEN_OFF; 
  PORT_InitStruct.PORT_FUNC = PORT_FUNC_PORT; 
  PORT_InitStruct.PORT_SPEED = PORT_OUTPUT_OFF; 
  PORT_InitStruct.PORT_MODE = PORT_MODE_ANALOG; 
  PORT_Init (MDR_PORTD, &PORT_InitStruct);
}
Вот кусок программы по обработке значений АЦП
void ADC_Cycle (void)
{
  // АЦП2 опрашивается аналогичным образом
  if (MDR_ADC->ADC1_STATUS & ADC_STATUS_FLG_REG_EOCIF)
    { Ch1_Select = (MDR_ADC->ADC1_RESULT>>16) & 0x1F;
      ADCValueBufer[Ch1_Select - 2] = MDR_ADC->ADC1_RESULT & 0xFFF; 
      Ch1_Select++;
      if (Ch1_Select>=9) Ch1_Select = 2;
      MDR_ADC->ADC1_CFG = (MDR_ADC->ADC1_CFG & ~ADC1_CFG_REG_CHS_Msk) | (Ch1_Select<<ADC1_CFG_REG_CHS_Pos) | ADC1_CFG_REG_GO; 
     }
 }
Попробуйте в режиме отладки в окне просмотра памяти вывести диапазон АЦП и убедится что бит выбора источника внешнего опорного напряжения установлен.


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-апр-17 15:48 
Не в сети

Зарегистрирован: 2010-фев-08 00:47
Сообщения: 82
Откуда: el'NiNo
ладно, соберём все вопросы по АПЦ в одном месте..

проблема, наверно, смешная, но я не могу заставить работать АЦП.
итак, порт d:
0 - swdio
1 - swclk
2-4 - висят в воздухе
5 - аналоговый выход с внешнего термодатчика
6 - контроль за опорным напряжением для внешнего АЦП
7 - цифровой выход

дефайны
#define ADC_CHANEL_T		5
#define ADC_CHANEL_Uref		6
#define ADC_CHANEL_T_int	31
инициализация порта
//Port D
MDR_PORTD->FUNC   = 0x00000000;	// Порт IO
MDR_PORTD->ANALOG = 0x0000FFFF;	// весь порт цифровой
MDR_PORTD->PWR    = 0xFFFFFFFF;	// Скорость max для всего порта
MDR_PORTD->OE     = 0x00000000;
//MDR_PORTD->PULL   = 0x00000000;
//MDR_PORTD->PD     = 0x00000000;
//MDR_PORTD->GFEN   = 0x00000000;
//MDR_PORTD->RXTX   = 0x00000000;
MDR_PORTD->ANALOG&= (~((1<<ADC_CHANEL_T)|(1<<ADC_CHANEL_Uref)));
MDR_PORTD->OE    |= (1<<7);
инициализируем АЦП:
void ADCInit (void){
	MDR_ADC->ADC1_CFG  = (0<<ADC1_CFG_REG_SAMPLE_Pos)| (0<<ADC1_CFG_REG_CLKS_Pos)|ADC1_CFG_REG_ADON;
	MDR_ADC->ADC1_CFG |= (1<<ADC1_CFG_TS_EN_Pos);
}
функция чтения:
int ADCRead (char chanel){
	MDR_ADC->ADC1_CFG &= (~ADC1_CFG_REG_CHS_Msk); 
	MDR_ADC->ADC1_CFG |= (chanel<<ADC1_CFG_REG_CHS_Pos);
	MDR_ADC->ADC1_CFG |= ADC1_CFG_REG_GO;
	while (!(MDR_ADC->ADC1_STATUS & ADC_STATUS_FLG_REG_EOCIF));
	return MDR_ADC->ADC1_RESULT & ADC_RESULT_Msk;
}
пересчёт в вольты:
Temp[0] = ((float)ADCRead(ADC_CHANEL_T))* 3.3/4096;
Uref[0] = ((float)ADCRead(ADC_CHANEL_Uref))* 3.3/4096;
чтение температуры со встроенного датчика :
MDR_ADC->ADC1_CFG |= (1<<ADC1_CFG_SEL_TS_Pos);
MDR_ADC->ADC1_CFG |= (1<<ADC1_CFG_TS_BUF_EN_Pos);
Temp_Int[0] = (float)ADCRead(ADC_CHANEL_T_int);
MDR_ADC->ADC1_CFG |= (0<<ADC1_CFG_SEL_TS_Pos);
MDR_ADC->ADC1_CFG |= (0<<ADC1_CFG_TS_BUF_EN_Pos);
какие проблемы:
1) при подключенном и отключенном jtag-адаптере к jtag_b в режиме swd с ацп считываются разные значения (даже просто при касании рукой к выводу pd1 уходят значения);
2) пересчитанные в вольты значения АЦП имеют мало общего с реальностью (контроль осциллографом и вольтметром);
3) термодатчик в мк вообще никак не реагирует на нагрев.

где я косячу?


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-апр-20 16:00 
Не в сети

Зарегистрирован: 2012-янв-10 10:47
Сообщения: 25
Откуда: ОАО АНПП "ТЕМП-АВИА"
Здравствуйте, вопрос по поводу опорного напряжения с датчика температуры.
Выбираем в качестве опоры -VREF датчика температуры, сигнал для преобразования поступает по каналу 7 с резистора TRIM.
sADCx.ADC_VRefSource = ADC_VREF_SOURCE_INTERNAL;
sADCx.ADC_IntVRefSource = ADC_INT_VREF_SOURCE_EXACT;
sADCx.ADC_ChannelNumber = ADC_CH_ADC7;

проверил, по адресу 0х4008_8004 установлен бит ADC1_OP 0x00020000
Изменяем подстройку опорного напряжения TR, например с 0 на 7
sADC.ADC_IntVRefTrimming = 7;

по идее код преобразования должен увеличиться, но изменений нет, при этом если для оцифровки сигнала выбрать канал 30 (c VREF датчика температуры) величина сигнала меняется с 1,239В на 1,218В
Также изменение источника опорного напряжения от датчика температуры на внутренний ADC не влияет на результат преобразования, хотя у вас написано что он менее точный.
sADCx.ADC_IntVRefSource = ADC_INT_VREF_SOURCE_INEXACT;
В связи с этим возникаю сомнения, что опорное напряжение берется с датчика температуры.


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-апр-24 10:46 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 532
Цитата:
Попробуйте в режиме отладки в окне просмотра памяти вывести диапазон АЦП и убедится что бит выбора источника внешнего опорного напряжения установлен.
Был в командировке, поэтому задержка с ответом.
Отладчик (Keil 4.23) показывает следующее
MDR_ADC->ADC1_CFG = 0xE003825
MDR_ADC->ADC2_CFG = 0xE003895

бит выбора источника опорного напряжения установлен в 1( 1<<11 = 0x800). По описанию опора внешняя
Кстати, если вывести структуру MDR_ADC в окно Watch и раскрыть ее, то АЦП подвисает (данные не обновляются) до сброса контроллера. Если струтура свернута (в окне Watch регистры АЦП не отслеживаются), то АЦП работает.


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-апр-25 09:14 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1318
Откуда: АО "ПКК Миландр"
1. по поводу VREF. Есть путаница в описании. Там есть два источника опорного напряжения:
- собственно опорное напряжение для преобразования, которое может быть либо равным аналоговому питанию, либо браться с выводов VREF+ и VREF- (и выбирается битом Cfg_M_REF).
- а так же есть источник на 1,23В - который тоже называется источником опорного напряжения, но он нужен только для работы термодатчика и может использоваться самим АЦП для снижения своего потребления (бит 17 и 18 в CFG2), но на точность и значения преобразования он не влияет.

Так вот источник 1,23 может триминговаиться, но может повлиять только на 30 канал (собственно сам) и на 31 (датчик температуры).

2. Так как сброс флага наличия результата EOCIF происходит автоматически при считывании регистра RESULT, то когда АЦП отображается в окне watch, то среда разработки периодически считывает этот регистр RESULT тем самым сбрасывая регистр EOCIF и это может привести к "зависанию" так как программа, запустила преобразование, и ждет EOCIF, но сразу после его взведения его сбросит чтение со стороны watch, и программа его никогда не дождется.


По поводу внешней опоры с VREF+ и VREF- - это проверялось многократно и собственно в этом режиме тестируется АЦП при отбраковки. Так что должно работать. Смотрите все же свой проект, возможно как то 5В попадает на нетоллерантные выводы, либо у вас вторая ревизия кристаллов (выпуск 10 года).


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-апр-25 11:47 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 532
На корпусе МК цифры под маркировкой 1202 (что реально внутри не могу сказать).
ВСЕ выводы порта PORTD используются как аналоговые,
PORTE - частично притянут к +5В, но все выводы PORTE используются как цифровые.

конфигурация АЦП для преобразования от внешнего источника правильная???
MDR_ADC->ADC1_CFG = 0xE003825
MDR_ADC->ADC2_CFG = 0xE003895

P.S.
Может какие шаманства при проверке делаете (например синхронное преобразование канала 0 и измеряемого канала) :?
изменить опору на 1,5 - 2В сейчас не получиться (для получеия бОльшей разницы в измерениях). А 10 процентов разницы в опоре дают близкие результаты, особенно при измерении напряжений до 0,5В.


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-апр-25 12:00 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1318
Откуда: АО "ПКК Миландр"
редактор писал(а):
На корпусе МК цифры под маркировкой 1202 (что реально внутри не могу сказать).
ВСЕ выводы порта PORTD используются как аналоговые,
PORTE - частично притянут к +5В, но все выводы PORTE используются как цифровые.

конфигурация АЦП для преобразования от внешнего источника правильная???
MDR_ADC->ADC1_CFG = 0xE003825
MDR_ADC->ADC2_CFG = 0xE003895

P.S.
Может какие шаманства при проверке делаете (например синхронное преобразование канала 0 и измеряемого канала) :?
изменить опору на 1,5 - 2В сейчас не получиться (для получеия бОльшей разницы в измерениях). А 10 процентов разницы в опоре дают близкие результаты, особенно при измерении напряжений до 0,5В.
1202 - это последняя не текущий момент версия.
В порте E аналоговыми функциями обладают выводы PE[10...0] - у них нет толлерантности к 5В и 5В на них подавать нельзя, независимо от того в каком они режиме (цифровой или аналоговый). Проверьте.

Настройка регистров в принципе правильная. Должно работать.


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-апр-25 13:16 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 532
Цитата:
В порте E аналоговыми функциями обладают выводы PE[10...0] - у них нет толлерантности к 5В и 5В на них подавать нельзя, независимо от того в каком они режиме (цифровой или аналоговый). Проверьте.
Спасибо за ответы.
PE0 - PE5 притянуты к +5В через резисторы, должны были работать как входы.
Плату понесли на доработку, отпишусь по результатам проверки.


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-май-02 15:06 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 532
+5в от PE отрезал. Результат стал ближе к истине, но не идеален.
Опорное напряжение 3.00В (ref293). Вход АЦП 0.192В. Результат преобразования в диапазоне 0xFD...0x102.
Можно принять среднее значение 0x100/ Хотя при данном раскладе ожидалось 0x106 (+/-) погрешность.
При измерении каналы не переключались. Если ошибка связана с тем, что PE "подкоптился", то плохо для платы. Скоро будет второй образец, на нем еще проверю.
P.S. Все измерения напряжения проводились поверенным вольтметром В7-38.


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-май-02 16:43 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1318
Откуда: АО "ПКК Миландр"
редактор писал(а):
+5в от PE отрезал. Результат стал ближе к истине, но не идеален.
Опорное напряжение 3.00В (ref293). Вход АЦП 0.192В. Результат преобразования в диапазоне 0xFD...0x102.
Можно принять среднее значение 0x100/ Хотя при данном раскладе ожидалось 0x106 (+/-) погрешность.
При измерении каналы не переключались. Если ошибка связана с тем, что PE "подкоптился", то плохо для платы. Скоро будет второй образец, на нем еще проверю.
P.S. Все измерения напряжения проводились поверенным вольтметром В7-38.
Т.е. теперь АЦП "врет" вниз ?
А что за источник 0.192В ? Попробуйте проверить не "генерят" ли источники, вольтметр дело хорошее, но он определяет уровень путем интегрирования за достаточно большое время, а если "генереж" или помеха по опоре или сигналу вызвана работой или шумами от микроконтроллера, то эта ошибка строго синхронна микроконтроллеру. Можно попробовать реализовать режим, что бы микроконтроллер работал на HSE или его производных, а АЦП работал от HSI. В этом случае основная помеха от микроконтроллера и частота преобразования "разбегутся" и усреднение даст более достоверный результат.


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-май-04 15:36 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 532
Спасибо за советы. АЦП привирает (уже не врет) не вниз, а в том же направлении (если по данным пересчитать опору то получается ок 3.08..3.1В)
Нагрузка - резистор на 50 Ом. Включение нагрузки производится через ключ, который в реальности будет управляться ШИМом. На время измерений ключ открывается ну почти на полную.(Основание счета (период ШИМа) 0xFFFF, значение в CCR 0xFFFF).Частота ШИМа ок.150 Гц.
После праздников потыкаю плату осцилографом.
Кстати по поводу генерации ШИМ. В документации есть ошибка при описании регистра MDR_TIMERx->CHy_CTRL
биты 11..9,
Цитата:
Если CCR1_EN = 1;
...
110 – 1, если DIR = 0 (счет вверх), CCR1< CNT< CCR,иначе 0;
Реально получается 110 – 1, если DIR = 0 (счет вверх), CCR< CNT< CCR1,иначе 0;
Пока CCR1 не установил 0xFFFF, генерации шима не было.
Остальные режимы не пробовал :) .
Вот код инициализации таймера
  Tim->ARR = 0xFFFF; // основание счета
  Tim->CNTRL = 0x0000; // счет вверх, таймер пока отключен
  MDR_TIMER2->CCR11 = 0xFFFF;
  MDR_TIMER2->CH1_CNTRL1 = 0x1900; // 
  MDR_TIMER2->CH1_CNTRL2 = 0x0004; // Используется CCR1 (инверсный канал)
  ... 
  MDR_TIMER2->CNTRL |= 0x0001; // запускаем таймер


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 23 сообщения ]  На страницу 1 2 »

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя


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

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB