STM32F373 SDADC Отрицательные числа в Single ended offset

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Sturman_1
Родился
Сообщения: 1
Зарегистрирован: Вт июл 07, 2015 12:55:15

STM32F373 SDADC Отрицательные числа в Single ended offset

Сообщение Sturman_1 »

Отрицательные числа в Single ended offset mode режиме.. При настройке SDADC в STM32F373 в Single ended offset в диапазоне 0..0.1V снимаются отрицательные числа.. хотя написано «This mode of operation is similar to differential mode, except that the output data is only from 0 to +32767, and not from –32767 to +32767».. и нигде в документации не написано это смещение одинаковое для всех SDADC или разное для каждого, или для каждого канала.. Может что-то в инициализации.. не очень как-то радует перспектива для каждого устройства в котором задействованы все каналы SDADC для каждого находить свое смещение..

uint32_t Init_SDADC1 (void){
uint32_t SDADCTimeout = 0;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
// разрешаем тактирование сигма-дельта АЦП
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDADC2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDADC3, ENABLE);
// питание аналоговой части
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_SDADCAnalogCmd(PWR_SDADCAnalog_1, ENABLE);
PWR_SDADCAnalogCmd(PWR_SDADCAnalog_2, ENABLE);
PWR_SDADCAnalogCmd(PWR_SDADCAnalog_3, ENABLE);

RCC_SDADCCLKConfig(RCC_SDADCCLK_SYSCLK_Div14);// RCC_SDADCCLK_SYSCLK_Div48

gpio.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
gpio.GPIO_Mode = GPIO_Mode_AN;
gpio.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOE, &gpio);
gpio.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_Init(GPIOB, &gpio);

// выбор опорного напряжения
SDADC_VREFSelect(SDADC_VREF_Ext); //SDADC_VREF_VDDA SDADC_VREF_Ext
// включаем АЦП
SDADC_Cmd(SDADC1, ENABLE);

// вход в реим инициализации
SDADC_InitModeCmd(SDADC1, ENABLE);
SDADCTimeout = SDADC_INIT_TIMEOUT;
/* wait for INITRDY flag to be set */
while((SDADC_GetFlagStatus(SDADC1, SDADC_FLAG_INITRDY) == RESET) && (--SDADCTimeout != 0)){};
if(SDADCTimeout == 0){return 1;} /* INITRDY flag can not set */



// выбор режима работы (конфигурационная ячейка 0)
SDADC_AINStructure.SDADC_InputMode = SDADC_InputMode_SEOffset;
SDADC_AINStructure.SDADC_Gain = SDADC_Gain_1_2;
SDADC_AINStructure.SDADC_CommonMode = SDADC_CommonMode_VSSA;
SDADC_AINStructure.SDADC_Offset = 0;
SDADC_AINInit(SDADC1, SDADC_Conf_0, &SDADC_AINStructure);

// выбор каналов и задания режима работы
SDADC_ChannelConfig(SDADC1, SDADC_Channel_0, SDADC_Conf_0);
SDADC_ChannelConfig(SDADC1, SDADC_Channel_1, SDADC_Conf_0);
SDADC_ChannelConfig(SDADC1, SDADC_Channel_2, SDADC_Conf_0);
SDADC_ChannelConfig(SDADC1, SDADC_Channel_3, SDADC_Conf_0);
SDADC_ChannelConfig(SDADC1, SDADC_Channel_4, SDADC_Conf_0);
SDADC_ChannelConfig(SDADC1, SDADC_Channel_5, SDADC_Conf_0);
SDADC_ChannelConfig(SDADC1, SDADC_Channel_6, SDADC_Conf_0);
SDADC_ChannelConfig(SDADC1, SDADC_Channel_7, SDADC_Conf_0);
SDADC_ChannelConfig(SDADC1, SDADC_Channel_8, SDADC_Conf_0);

/* Channel0 configuration */
SDADC_InitStructure.SDADC_Channel = SDADC_Channel_0| SDADC_Channel_1| SDADC_Channel_2| SDADC_Channel_3| SDADC_Channel_4| SDADC_Channel_5| SDADC_Channel_6| SDADC_Channel_7| SDADC_Channel_8|;
SDADC_InitStructure.SDADC_ContinuousConvMode = DISABLE;
SDADC_InitStructure.SDADC_FastConversionMode = DISABLE;
SDADC_Init(SDADC1, &SDADC_InitStructure);

SDADC_InjectedChannelSelect(SDADC1, SDADC_Channel_0|SDADC_Channel_1|SDADC_Channel_2|SDADC_Channel_3|SDADC_Channel_4|SDADC_Channel_5|SDADC_Channel_6|SDADC_Channel_7|SDADC_Channel_8);

// внешний триггер
SDADC_ExternalTrigInjectedConvEdgeConfig(SDADC1, SDADC_ExternalTrigInjecConvEdge_Rising); // SDADC_ExternalTrigInjecConvEdge_Rising
SDADC_ExternalTrigInjectedConvConfig(SDADC1, SDADC_ExternalTrigInjecConv_T3_CC1);

// выход из режима настройки
SDADC_InitModeCmd(SDADC1, DISABLE);

// самокалибровка
SDADC_CalibrationSequenceConfig(SDADC1, SDADC_CalibrationSequence_1);
SDADC_StartCalibration(SDADC1);

SDADCTimeout = SDADC_CAL_TIMEOUT;
/* wait for MPX2102_SDADC Calibration process to end */
while((SDADC_GetFlagStatus(SDADC1, SDADC_FLAG_EOCAL) == RESET) && (--SDADCTimeout != 0)){};
if(SDADCTimeout == 0){return 2;}/* EOCAL flag can not set */

// разрешение работы с ПДП
SDADC_DMAConfig(SDADC1, SDADC_DMATransfer_Injected, ENABLE);

// ПДП2 канал 3 - сигма-дельта АЦП
DMA_DeInit(DMA2_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SDADC1->JDATAR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) BUFF.sadc1_buffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = (uint16_t)(BUF_SIZE_DMA_SADC1_3*SADC1_CHAN);
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel3, &DMA_InitStructure);
DMA_Cmd(DMA2_Channel3, ENABLE);

return 0;
}
Реклама
Аватара пользователя
Zud
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн авг 19, 2013 03:23:00
Откуда: замкадье

Re: STM32F373 SDADC Отрицательные числа в Single ended offse

Сообщение Zud »

Sturman_1 писал(а):в диапазоне 0..0.1V снимаются отрицательные числа..
А больше 0.1 В уже положительные? Тогда, возможно земля для АЦП и земля внешнего сигнала немного отличаются, и вы подаёте не 0..0.1V , а -0.1..0V .
Реклама
Ответить

Вернуться в «ARM»