小s是白痴 发表于 2016-6-27 10:29:43

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);





}
}












wenyangzeng 发表于 2016-6-29 10:11:46

ADC_RegularChannelConfig(ADC1, ADC_Channel_16 , 1, ADC_SampleTime_384Cycles);
这句只应该在初始化中运行一次即可,你在循环中反复运行可能打乱了ADC采样。

花渡.青花瓷 发表于 2016-6-30 15:18:55

有没有可能是初始化出的问题

小s是白痴 发表于 2016-7-5 17:11:49

wenyangzeng 发表于 2016-6-29 10:11
ADC_RegularChannelConfig(ADC1, ADC_Channel_16 , 1, ADC_SampleTime_384Cycles);
这句只应该在初始化中运 ...

wenyangzeng大大感谢你的回复 


我有依照你的建议
在初始化中只运行一次
还是没有办法读到数据


小s是白痴 发表于 2016-7-5 17:18:09

本帖最后由 小s是白痴 于 2016-7-5 17:29 编辑

花渡.青花瓷 发表于 2016-6-30 15:18
有没有可能是初始化出的问题
花渡.青花瓷大大感谢你的回复



可是 channel_5 及 channel_17
是可以读取数据的

如果是初始化出问题
这2个channel应该也会读不到
但是就只有channel_16读不到


页: [1]
查看完整版本: STM32L151C8T6 Temperture Sensor 读不到数据