×

Внимание

Форум находится в режиме только для чтения.

как померить температуру встроенным сенсором в stm32f107?

11 года 6 мес. назад #4354 от Денис Ягов
а чем у вас питается контроллер?

1.Разделите аналоговое питание с цифровым. Аналоговое соединяется с общим питанием через RC-цепь. Ёмкость - керамика на 1 мкФ и более. Сопротивление - десяток Ом ....... Ну или что-то типа того.

2. Есть ноут как достигнуть разрешения 12 бит. думаю, будет полезен - качайте вложение.
11 года 6 мес. назад #4356 от k000858
контроллер установлен на плате STM3240G-EVAL. плата питается от USB, либо от б/п, идущего в комплекте с платой.
11 года 6 мес. назад #4357 от Денис Ягов
Поставьте время сэмплирования ADC_SampleTime_480Cycles.

А он что-то ещё кроме температуры измеряет?
11 года 6 мес. назад #4363 от super_puper
у меня на на 13 циклосов и я не уверен что точно показывает
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
ADC_InjectedChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_13Cycles5);//1,7,13,28,41,55,71,239




void RCC_Configuration(void){// настройка частоты 
 RCC_ClocksTypeDef RCC_ClockFreq;

// Сбрасываем клокинг в "0"
  RCC_DeInit();

// Включаем внешний кварц
  RCC_HSEConfig(RCC_HSE_ON);

// Ждём пока устанавливается внешний ВЧ тактовый сигнал
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus != ERROR)
  {
    // Внешний тактовый сигнал появился, стабильный
    // разрешаем использование буфера команд
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    //
    // итак
    //Внешний кварц 25МГц
    //Тактовая частота ядра: 72МГц
    // частота шины PCLK2=72МГц
    // частота шины PCLK1=36МГц
    //

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);
    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);
    /*  ADCCLK = PCLK2/4 */
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);

// Выставляем делители / множители частоты тактирования
    RCC_PREDIV2Config(RCC_PREDIV2_Div5);
    RCC_PLL2Config(RCC_PLL2Mul_8);

//Разрешаем PLL2
    RCC_PLL2Cmd(ENABLE);

// Ждём пока устаканится PLL2
    while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
    {}

// PLL2 - устаканился    
// конфигурируем PLL1
    RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
    RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);

// Разрешаем PLL
    RCC_PLLCmd(ENABLE);

// Ждём готовности PLL
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {}

// Выбираем PLL как источник тактирования системы
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

// Ждём пока PLL не станет клокингом системы
    while (RCC_GetSYSCLKSource() != 0x08)
    {}
  }

  RCC_GetClocksFreq(&RCC_ClockFreq);

// Тактирование портов АЦП и USB
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC |
                         RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO | RCC_APB2Periph_ADC1, ENABLE );

  // Выбираем тактирование для USB
  RCC_OTGFSCLKConfig(RCC_OTGFSCLKSource_PLLVCO_Div3);

  // Подключаем выбранное тактирование
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_OTG_FS, ENABLE) ;
}
11 года 6 мес. назад #4364 от Денис Ягов
Чем больше время сэмплирования тем меньше шумов.
11 года 6 мес. назад #4369 от k000858
в данный момент инициализация модуля выглядит так
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	ADC_InitTypeDef ADC_InitStructure;
	ADC_CommonInitTypeDef ADC_CommonInitStructure;

	ADC_CommonInitStructure.ADC_Mode				= ADC_Mode_Independent;
	ADC_CommonInitStructure.ADC_Prescaler			= ADC_Prescaler_Div2;
	ADC_CommonInitStructure.ADC_DMAAccessMode		= ADC_DMAAccessMode_Disabled;
	ADC_CommonInitStructure.ADC_TwoSamplingDelay	= ADC_TwoSamplingDelay_20Cycles; 
	ADC_CommonInit(&ADC_CommonInitStructure); 

	ADC_StructInit(&ADC_InitStructure);
	ADC_InitStructure.ADC_Resolution				= ADC_Resolution_12b;
	ADC_InitStructure.ADC_ScanConvMode				= DISABLE;
	ADC_InitStructure.ADC_ContinuousConvMode		= ENABLE;
	ADC_InitStructure.ADC_ExternalTrigConvEdge		= ADC_ExternalTrigConvEdge_None; 
	ADC_InitStructure.ADC_DataAlign					= ADC_DataAlign_Right;
	ADC_InitStructure.ADC_NbrOfConversion			= 1;
	ADC_Init(ADC1, &ADC_InitStructure);

	ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_480Cycles);	// ADC1 regular channel16 configuration
	ADC_TempSensorVrefintCmd(ENABLE);
	ADC_Cmd(ADC1, ENABLE);
	ADC_SoftwareStartConv(ADC1);	// Start ADC1 Software Conversion
сначало считаю напряжение (Vsense) =  ADC_GetConversionValue(ADC1)*3300/0xFFF
при комнатной температуре (20-22 гр) показывает 0.78В, что соответсвует 33 градусам по формуле 
Temperature (in °C) = {(VSENSE – V25) / Avg_Slope} + 25
Avg_Slope = 2.5 mV/°C
V25 = 0.76 V
показания датчика не меняются в зависимости от тип выбранного питания (USB/бп), да и врятли должны, инженеры в СТ не дураки, они ведь STM3240G-EVAL разрабатывали )).

быть может в инициализации чего то не хватает?
Время создания страницы: 0.041 секунд
Работает на Kunena форум