- Главная
- Форум
- Микроконтроллеры и Системы на Модуле (SOM)
- Микроконтроллеры
- как померить температуру встроенным сенсором в stm32f107?
- Форум
- Микроконтроллеры и Системы на Модуле (SOM)
- Микроконтроллеры
- как померить температуру встроенным сенсором в stm32f107?
как померить температуру встроенным сенсором в stm32f107?
- Денис Ягов
- Посетитель
11 года 6 мес. назад #4354
от Денис Ягов
Денис Ягов ответил в теме Re: как померить температуру встроенным сенсором в stm32f107?
а чем у вас питается контроллер?
1.Разделите аналоговое питание с цифровым. Аналоговое соединяется с общим питанием через RC-цепь. Ёмкость - керамика на 1 мкФ и более. Сопротивление - десяток Ом ....... Ну или что-то типа того.
2. Есть ноут как достигнуть разрешения 12 бит. думаю, будет полезен - качайте вложение.
1.Разделите аналоговое питание с цифровым. Аналоговое соединяется с общим питанием через RC-цепь. Ёмкость - керамика на 1 мкФ и более. Сопротивление - десяток Ом ....... Ну или что-то типа того.
2. Есть ноут как достигнуть разрешения 12 бит. думаю, будет полезен - качайте вложение.
- k000858
- Посетитель
11 года 6 мес. назад #4356
от k000858
k000858 ответил в теме Re: как померить температуру встроенным сенсором в stm32f107?
контроллер установлен на плате STM3240G-EVAL. плата питается от USB, либо от б/п, идущего в комплекте с платой.
- Денис Ягов
- Посетитель
11 года 6 мес. назад #4357
от Денис Ягов
Денис Ягов ответил в теме Re: как померить температуру встроенным сенсором в stm32f107?
Поставьте время сэмплирования ADC_SampleTime_480Cycles.
А он что-то ещё кроме температуры измеряет?
А он что-то ещё кроме температуры измеряет?
- super_puper
- Автор темы
- Посетитель
11 года 6 мес. назад #4363
от super_puper
super_puper ответил в теме Re: как померить температуру встроенным сенсором в stm32f107?
у меня на на 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) ;
}
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
от Денис Ягов
Денис Ягов ответил в теме Re: как померить температуру встроенным сенсором в stm32f107?
Чем больше время сэмплирования тем меньше шумов.
- k000858
- Посетитель
11 года 6 мес. назад #4369
от k000858
k000858 ответил в теме Re: как померить температуру встроенным сенсором в stm32f107?
в данный момент инициализация модуля выглядит таксначало считаю напряжение (Vsense) = ADC_GetConversionValue(ADC1)*3300/0xFFF
при комнатной температуре (20-22 гр) показывает 0.78В, что соответсвует 33 градусам по формулепоказания датчика не меняются в зависимости от тип выбранного питания (USB/бп), да и врятли должны, инженеры в СТ не дураки, они ведь STM3240G-EVAL разрабатывали )).
быть может в инициализации чего то не хватает?
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
при комнатной температуре (20-22 гр) показывает 0.78В, что соответсвует 33 градусам по формуле
Temperature (in °C) = {(VSENSE – V25) / Avg_Slope} + 25
Avg_Slope = 2.5 mV/°C
V25 = 0.76 V
быть может в инициализации чего то не хватает?
- Форум
- Микроконтроллеры и Системы на Модуле (SOM)
- Микроконтроллеры
- как померить температуру встроенным сенсором в stm32f107?
Время создания страницы: 0.041 секунд