你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L151C8T6 Temperture Sensor 读不到数据

[复制链接]
小s是白痴 提问时间:2016-6-27 10:29 /
本帖最后由 小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 int  g_uiADC_CH_Value[20];
/**********************************************************/


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[16] =  ADC_GetConversionValue(ADC1);
   g_ftTemperature =((110-30)/(g_ftTS_CAL2-g_ftTS_CAL1)) * (g_uiADC_CH_Value[16] - 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[17] = ADC_GetConversionValue(ADC1);
   fCalCulBuf1 = g_uiADC_CH_Value[17];

   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[5] = ADC_GetConversionValue(ADC1);   
   g_ftADCBUF5 = g_uiADC_CH_Value[5]* (g_ftVDDa/4095);





  }
}












ADC_Temperature_TEST2.rar

下载

2.31 MB, 下载次数: 14, 下载积分: ST金币 -1

ADC_temperature

收藏 评论4 发布时间:2016-6-27 10:29

举报

4个回答
wenyangzeng 回答时间:2016-6-29 10:11:46
ADC_RegularChannelConfig(ADC1, ADC_Channel_16 , 1, ADC_SampleTime_384Cycles);
这句只应该在初始化中运行一次即可,你在循环中反复运行可能打乱了ADC采样。

评分

参与人数 1ST金币 +4 收起 理由
zero99 + 4 赞一个!

查看全部评分

花渡.青花瓷 回答时间: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读不到


关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版