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

 
 
> STM32F10x Внутренний датчик температуры, не понятные показания температуры
bullit
сообщение Jan 10 2013, 09:10
Сообщение #1


пуля
****

Группа: Свой
Сообщений: 674
Регистрация: 10-05-06
Из: Уфа
Пользователь №: 16 959



Добрый день!
Процессор STM32F103c8t6.
Столкнулся с проблемой что по 16 каналу (TempSense) ADC1 значение не меняется, как процек не грей!
Код инициализации:
CODE
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);

// Enable ADC1 reset calibration register
ADC_ResetCalibration(ADC1 );
// Check the end of ADC1 reset calibration register
while (ADC_GetResetCalibrationStatus(ADC1 ));

// Start ADC1 calibration
ADC_StartCalibration(ADC1 );
// Check the end of ADC1 calibration
while (ADC_GetCalibrationStatus(ADC1 ));

ADC_InitTypeDef ADC_InitStructure;
/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);

ADC_TempSensorVrefintCmd(ENABLE);
/* ADC1 regular channels configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5 );

ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);


Код запуска конвертирования (запускаем раз в секунду):
Код
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

Код прерывания:
Код
adcdata = ADC_GetConversionValue(ADC1);
adcVolt  = adcdata*3.3/4096;
diffVolt =   0.76 - adcVolt;
temp1  = diffVolt / (2.5/1000);//0.00025;
temp2 = temp1 +25;
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC );


adcdata постоянно равен 1738 +/- 10 едениц. Код тестировался на 2-3 процеках значения теже. Явно в коде, но что не пойму!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
bullit
сообщение Jan 11 2013, 05:53
Сообщение #2


пуля
****

Группа: Свой
Сообщений: 674
Регистрация: 10-05-06
Из: Уфа
Пользователь №: 16 959



ну что тут сказать... дело было не в бабине....)
Из-за не внимательности коэффициенты для расчёта температуры стояли от F4 серии (они отличаются). Отсюда и все непонятки появлялись!
Выкладываю код в окончательном виде (для f10x и f4xx):
CODE
#if defined (STM32F10X_LD) || defined (STM32F10X_LD_VL) || defined (STM32F10X_MD) ||
defined (STM32F10X_MD_VL) || defined (STM32F10X_HD) || defined (STM32F10X_CL)

RCC_ADCCLKConfig(RCC_PCLK2_Div4);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);

ADC_InitTypeDef ADC_InitStructure;
//ADC1 configuration ------------------------------------------------------
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);


// ADC1 regular channels configuration
ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5 );
ADC_TempSensorVrefintCmd(ENABLE);


// Enable ADC1
ADC_Cmd(ADC1, ENABLE);


// Enable ADC1 reset calibration register
ADC_ResetCalibration(ADC1 );
// Check the end of ADC1 reset calibration register
while (ADC_GetResetCalibrationStatus(ADC1 ));

// Start ADC1 calibration
ADC_StartCalibration(ADC1 );
// Check the end of ADC1 calibration
while (ADC_GetCalibrationStatus(ADC1 ));

/* ADC3 regular channel12 configuration *************************************/
//ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_3Cycles );

ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);

#else
#ifdef STM32F4XX

ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

/* ADC Common Init **********************************************************/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);

/* ADC3 Init ****************************************************************/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC1, &ADC_InitStructure);

/* ADC3 regular channel12 configuration *************************************/
ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_3Cycles );

ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/* Enable ADC3 */
ADC_Cmd(ADC1, ENABLE);

// разрешение прерывания по завершению преобразования
ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_480Cycles);

ADC_TempSensorVrefintCmd(ENABLE);
#else
#error *** Не выбран процессор ***
#endif
#endif


Обработчик прерывания:
CODE
#if defined (STM32F10X_LD) || defined (STM32F10X_LD_VL) || defined (STM32F10X_MD) || defined (STM32F10X_MD_VL) ||
defined (STM32F10X_HD) || defined (STM32F10X_CL)
float tempera2;
void ADC1_2_IRQHandler(void)
{
adcdata = ADC_GetConversionValue(ADC1 );
tempera2 = (1.43 - adcdata * 0.00080586) / 0.0043 + 25;

CPUTempSense = 25+(1775 - adcdata )*18736/100000;

ADC_ClearITPendingBit(ADC1, ADC_IT_EOC );
}

#else
#ifdef STM32F4XX

void ADC_IRQHandler(void)
{
adcdata = ADC1 ->DR;
CPUTempSense = 25 + (adcdata - 943) * 3223 / 10000;
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC );
}
#else
#error *** Не выбран процессор ***
#endif
#endif


PS читайте даташиты внимательней меньше будет проблем))
Всем спасибо!
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:56
Рейтинг@Mail.ru


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