STM32L151C8T6 Temperture Sensor 读不到数据
本帖最后由 小s是白痴 于 2016-6-27 11:29 编辑//使用debug模式观看// Channel_5 及channel_17的数据可以读的到// Channel_16 温度sensor 读不到//请问各位先进,小弟有哪个地方设错了//附上完整档案/**********************************************************/
//refer AN3964 page3,page6
#define VREFINT_CAL_Adr 0x1FF80078
#define TS_CAL1_Adr 0x1FF8007A
#define TS_CAL2_Adr 0x1FF8007C
//*****************************************************************************
//* Private variables */
//*****************************************************************************
float g_ftTemperature;
float g_ftADCBUF5;
float g_ftADCBUF16;
float g_ftADCBUF17;
float g_ftVDDa;
float g_ftVREFINT_CAL;
float g_ftTS_CAL1;
float g_ftTS_CAL2;
unsigned intg_uiADC_CH_Value;
/**********************************************************/
int main(void)
{
uint32_t *pttmpreg ;
float fCalCulBuf1;
//-----------------------------------------------------------------------------
//Peripheral clock configuration
//-----------------------------------------------------------------------------
/* GPIOD Periph clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
//***************************************************/
// ADC1 Configuration
//***************************************************/
ADC_InitTypeDef ADC_InitStructure;
RCC_HSICmd(ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_DeInit(ADC1);
ADC_TempSensorVrefintCmd(ENABLE); //Enable Cannel_16(Temperature Sensor)
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
// Disable the scan conversion so we do one at a time //
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
// Don't do contimuous conversions - do them on demand //
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
// Start conversin by software, not an external trigger //
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None;
// Initialize the ADC_ExternalTrigConv member //
//ADC_InitStructure->ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;
// Conversions are 12 bit - put them in the lower 12 bits of the result //
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
// Say how many channels would be used by the sequencer //
ADC_InitStructure.ADC_NbrOfConversion = 1;
// Now do the setup //
ADC_Init(ADC1, &ADC_InitStructure);
// Enable ADC1 //
ADC_Cmd(ADC1, ENABLE);
//**************************************************/
pttmpreg = (uint32_t *) VREFINT_CAL_Adr;
g_ftVREFINT_CAL = (*pttmpreg)&0xFFFF;
pttmpreg = (uint32_t *) TS_CAL1_Adr;
g_ftTS_CAL1 = (*pttmpreg)&0xFFFF;
pttmpreg = (uint32_t *) TS_CAL2_Adr;
g_ftTS_CAL2 = (*pttmpreg)>>16;
//***************************************************/
//* MAIN LOOP */
//***************************************************/
while (1)
{
// ADC_Channel_16
ADC_RegularChannelConfig(ADC1, ADC_Channel_16 , 1, ADC_SampleTime_384Cycles);
ADC_SoftwareStartConv(ADC1);
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==0);
g_uiADC_CH_Value =ADC_GetConversionValue(ADC1);
g_ftTemperature =((110-30)/(g_ftTS_CAL2-g_ftTS_CAL1)) * (g_uiADC_CH_Value - g_ftTS_CAL1) + 30;
// ADC_Channel_17
ADC_RegularChannelConfig(ADC1, ADC_Channel_17 , 1, ADC_SampleTime_384Cycles);
ADC_SoftwareStartConv(ADC1);
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==0);
g_uiADC_CH_Value = ADC_GetConversionValue(ADC1);
fCalCulBuf1 = g_uiADC_CH_Value;
g_ftVDDa =3 * g_ftVREFINT_CAL / fCalCulBuf1 ;
// ADC_Channel_5
ADC_RegularChannelConfig(ADC1, ADC_Channel_5 , 1, ADC_SampleTime_384Cycles);
ADC_SoftwareStartConv(ADC1);
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==0);
g_uiADC_CH_Value = ADC_GetConversionValue(ADC1);
g_ftADCBUF5 = g_uiADC_CH_Value* (g_ftVDDa/4095);
}
}
ADC_RegularChannelConfig(ADC1, ADC_Channel_16 , 1, ADC_SampleTime_384Cycles);
这句只应该在初始化中运行一次即可,你在循环中反复运行可能打乱了ADC采样。 有没有可能是初始化出的问题 wenyangzeng 发表于 2016-6-29 10:11
ADC_RegularChannelConfig(ADC1, ADC_Channel_16 , 1, ADC_SampleTime_384Cycles);
这句只应该在初始化中运 ...
wenyangzeng大大感谢你的回复
我有依照你的建议
在初始化中只运行一次
还是没有办法读到数据
本帖最后由 小s是白痴 于 2016-7-5 17:29 编辑
花渡.青花瓷 发表于 2016-6-30 15:18
有没有可能是初始化出的问题
花渡.青花瓷大大感谢你的回复
可是 channel_5 及 channel_17
是可以读取数据的
如果是初始化出问题
这2个channel应该也会读不到
但是就只有channel_16读不到
页:
[1]