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

STM8S105 ADC使用求助

[复制链接]
陈金华 提问时间:2015-9-28 16:50 /
基于 STM8MC-KIT v1.0 库;
问题:使用ADC1通道3,5,测试发现通道5使用正常,通道3随通道5电压改变,示波器测量通道3的电压为固定300mV值;为什么通道3会随通道5改变呢?通道3非悬空状态,实际上是经过电阻分压测量输出电源电压用的。上代码
初始化:
  1. void Init_ADC( void )
  2. {
  3.         u8 value;
  4.         u16 ADC_TDR_tmp;

  5.         //ADC_Sync_State = ADC_USER_SYNC_INIT;
  6.         ADC_Sync_State = ADC_CURRENT_INIT;
  7.         ADC_State = ADC_SYNC;

  8.         ADC1->CSR = 0;
  9.        
  10.         //select 4MHz clock based on 16MHz fMaster (div4), single mode
  11.         //       6MHz clock based on 24MHz fMaster (div4)
  12.         ADC1->CR1 = BIT5|BIT6;

  13.         //select internal trigger TIM1 TRGO
  14.         ADC1->CR2 = 0;

  15.         //select phase input
  16. //        ADC1->CSR = PHASE_C_BEMF_ADC_CHAN;
  17.         ADC1->CSR = ADC_USER_ASYNC_CHANNEL;

  18.         ADC_TDR_tmp = 0;
  19. //        ADC_TDR_tmp |= (u16)(1) << PHASE_A_BEMF_ADC_CHAN;
  20. //        ADC_TDR_tmp |= (u16)(1) << PHASE_B_BEMF_ADC_CHAN;
  21. //        ADC_TDR_tmp |= (u16)(1) << PHASE_C_BEMF_ADC_CHAN;

  22.         ADC_TDR_tmp |= (u16)(1) << ADC_CURRENT_CHANNEL;
  23. //        ADC_TDR_tmp |= (u16)(1) << ADC_USER_SYNC_CHANNEL;

  24.         ADC_TDR_tmp |= (u16)(1) << ADC_BUS_CHANNEL;
  25. //        ADC_TDR_tmp |= (u16)(1) << ADC_NEUTRAL_POINT_CHANNEL;
  26. //        ADC_TDR_tmp |= (u16)(1) << ADC_TEMP_CHANNEL;
  27.         ADC_TDR_tmp |= (u16)(1) << ADC_USER_ASYNC_CHANNEL;

  28.         ToCMPxH( ADC1->TDRH, ADC_TDR_tmp);
  29.         ToCMPxL( ADC1->TDRL, ADC_TDR_tmp);
  30.        
  31.         //enable trigger
  32.         ADC1->CR2 |= BIT6;

  33.         //enable ADC
  34.         ADC1->CR1 |= BIT0;
  35.         //allow ADC to stabilize
  36.         value=30;
  37.         while(value--);                    
  38.         //clear interrupt flag
  39.         ADC1->CSR &= (u8)(~BIT7);
  40.         ADC1->CSR |= BIT5;
  41. }
复制代码


中断:
  1. #ifdef HALL
  2.         @near @interrupt @svlreg void ADC2_IRQHandler (void)
  3.         {
  4.                 u16 data;
  5.                
  6.                 data = ADC1->DRH;
  7.                 data <<= 2;
  8.                 data |= (ADC1->DRL & 0x03);

  9.                 //clear interrupt flag
  10.                 ADC1->CSR &= (u8)(~BIT7);
  11.                 //ADC_Async_State = ADC_USER_ASYNC_SAMPLE;

  12.                 // Manage async sampling
  13.                 switch (ADC_Async_State)
  14.                 {
  15.                         default:
  16.                         case ADC_BUS_SAMPLE:
  17.                                 ADC_Buffer[ ADC_BUS_INDEX ] = data;
  18.                                 //ADC_Async_State = ADC_TEMP_INIT;
  19.                                 ADC_Async_State = ADC_USER_ASYNC_INIT;

  20.                         break;

  21.                         case ADC_TEMP_SAMPLE:
  22.                                 ADC_Buffer[ ADC_TEMP_INDEX ] = data;
  23.                                 ADC_Async_State = ADC_NEUTRAL_POINT_INIT;
  24.                         break;

  25.                         case ADC_NEUTRAL_POINT_SAMPLE:
  26.                                 ADC_Buffer[ ADC_NEUTRAL_POINT_INDEX ] = data;
  27.                                 ADC_Async_State = ADC_USER_ASYNC_INIT;
  28.                         break;

  29.                         case ADC_USER_ASYNC_SAMPLE:
  30.                                 ADC_Buffer[ ADC_USER_ASYNC_INDEX ] = data;
  31.                                 ADC_Async_State = ADC_BUS_INIT;
  32.                         break;
  33.                 }

  34.                 // Set the Async sampling channel
  35.                 switch (ADC_Async_State)
  36.                 {
  37.                         default:
  38.                         case ADC_BUS_INIT:
  39.                                 ADC1->CSR = (ADC_BUS_CHANNEL|BIT5);
  40.                                 ADC_Async_State = ADC_BUS_SAMPLE;

  41.                         break;
  42.                        
  43.                         case ADC_TEMP_INIT:
  44.                                 ADC1->CSR = (ADC_TEMP_CHANNEL|BIT5);
  45.                                 ADC_Async_State = ADC_TEMP_SAMPLE;
  46.                         break;

  47.                         case ADC_NEUTRAL_POINT_INIT:
  48.                                 ADC1->CSR = (ADC_NEUTRAL_POINT_CHANNEL|BIT5);
  49.                                 ADC_Async_State = ADC_NEUTRAL_POINT_SAMPLE;
  50.                         break;
  51.                        
  52.                         case ADC_USER_ASYNC_INIT:
  53.                                 ADC1->CSR = (ADC_USER_ASYNC_CHANNEL|BIT5);
  54.                                 ADC_Async_State = ADC_USER_ASYNC_SAMPLE;
  55.                         break;
  56.                 }

  57.                 // Configure syncronous sampling
  58.                 #ifdef DEV_CUT_1
  59.                         // Enable ext. trigger
  60.                         ADC1->CR2 |= BIT6;
  61.                         //turn on ADC fix bug on cut1 device
  62.                         ADC1->CR1 |= BIT0;  
  63.                 #else
  64.                         // Enable ext. trigger
  65.                         ADC1->CR2 |= BIT6;
  66.                 #endif               
  67.         }
  68. #endif
复制代码


收藏 评论4 发布时间:2015-9-28 16:50

举报

4个回答
你好我好大家好! 回答时间:2015-9-28 16:57:17
表示关注一下这个问题
陈金华 回答时间:2015-9-28 17:13:57

  谢谢
陈金华 回答时间:2015-9-28 18:16:47
顶起,高手们进来看看
ughbss 回答时间:2015-9-28 19:30:34
这个问题我没遇到过,我遇到过ADC切换通道后不准。解决办法是切换通道后ADC采样2次,只取后一次的值,就准了。虽然跟你的问题不太一样
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版