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

新人求助,stm8l151k4 ad采样的问题

[复制链接]
clain 提问时间:2015-6-19 15:26 /
//初始化函数
void ADC_Periph_Init(void)
{
  u8 idx;

  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);//使能ADC时钟
  CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);//使能DMA1时钟

  GPIO_Init(GPIOB,GPIO_Pin_5,GPIO_Mode_In_FL_No_IT);//浮空输入

  ADC_Cmd(ADC1,ENABLE);//打开ADC

  for (idx = 0;idx < 50;idx++);//adc上电需要一段时间

  ADC_VrefintCmd(ENABLE);//使能内部参考电压

  ADC_DMACmd(ADC1,ENABLE);//使用ADC的DMA功能

  //连续转换模式
  ADC_Init(ADC1, ADC_ConversionMode_Continuous,ADC_Resolution_12Bit, ADC_Prescaler_1);

  //ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_192Cycles);
  //ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels,ADC_SamplingTime_192Cycles);
   ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);                        

  ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);//内部参考电压
  ADC_ChannelCmd(ADC1, ADC_Channel_13, ENABLE);//通道13   PB5

  SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);

  DMA_Init(DMA1_Channel0,//通道0
          (uint32_t)&ADC_ConvertedValue,//缓冲区地址
          (uint16_t)ADC1_DR_Address,//ADC数据寄存器地址
          DMA_BUF_SIZE,//缓冲区大小
          DMA_DIR_PeripheralToMemory,//外设到内存
          DMA_Mode_Circular,//循环转换
          DMA_MemoryIncMode_Inc,//内存地址自增
          DMA_Priority_High,//优先级为高
          DMA_MemoryDataSize_HalfWord);//内存数据是半字位宽

  DMA_SetCurrDataCounter(DMA1_Channel0,DMA_BUF_SIZE);//设置转速的数据个数

  DMA_ITConfig(DMA1_Channel0,DMA_ITx_TC, ENABLE);//使能传输完成中断
  DMA_ITConfig(DMA1_Channel0,DMA_ITx_HT, DISABLE);

  DMA_Cmd(DMA1_Channel0,ENABLE);//使能通道0   

  DMA_GlobalCmd(ENABLE);//打开DMA

  ADC_SoftwareStartConv(ADC1);//software trigger
}
//DMA中断
INTERRUPT_HANDLER(DMA1_CHANNEL0_1_IRQHandler,2)
{uint16_t *p;
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
  if(DMA_GetITStatus(DMA1_IT_TC0) != RESET)
  {
    p=&ADC_ConvertedValue[0];
    Data_Pack_handle(p);

    DMA_ClearITPendingBit(DMA1_IT_TC0);
  }
}
//数据打包函数。
void Data_Pack_handle(uint16_t *P_DMA_data)
{uint8_t i;
  for(i=0;i<DMA_BUF_SIZE;i++)
    adc_val[i] = *P_DMA_data++;
}

void main(void)
{uint8_t sum,i;

  Sys_clk_config();
  Port_Init();
  ADC_Periph_Init();

  //MWWDG_Init();//窗口看门狗初始化函数
  enableInterrupts();//开中断
  while (1)
  {



     test = search_form(ADC_ConvertedValue[3]);
     temp_val = test-20;


}
连续采8个数,1000  1400 1000 1404  1001 1400 1000 1404 大概就是这样的采样结果,应该是800多才对呢。数据不是线性变化的。
8个数应该相差不多才对啊,请大家给指教一下

收藏 评论5 发布时间:2015-6-19 15:26

举报

5个回答
你好我好大家好! 回答时间:2015-6-19 22:48:51
帮顶               
jacobfeng 回答时间:2015-6-21 13:47:49
先找个例子跑跑看
MaxHammer 回答时间:2015-9-22 10:48:25
楼主你好,我也遇到了这个问题了,你解决了吗?能否讲讲解决方法?
clain 回答时间:2015-9-23 16:02:45
AD_Init();
      //内部参考电压采样
      ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);
      ADC_SoftwareStartConv(ADC1);
      while( ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0 );
      adc_val[0]=ADC_GetConversionValue(ADC1);
      ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, DISABLE);
     delay_ms(20);
      //外部输入采样
     ADC_ChannelCmd(ADC1, ADC_Channel_13, ENABLE);
      ADC_SoftwareStartConv(ADC1);
      while( ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0 );
      adc_val[1]=ADC_GetConversionValue(ADC1);
      ADC_ChannelCmd(ADC1, ADC_Channel_13, DISABLE);
     
     ADC_VrefintCmd(DISABLE); //禁止内部的VrefintAD功能
     ADC_Cmd(ADC1, DISABLE);
     CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, DISABLE);

//我是电池供电,所以用完了都要停止。先采内部电压做基准,因为电池电压会下降,要不然采数不准。
   t_chk =adc_val[1]*1224;
     v_cale= t_chk/ adc_val[0];


void AD_Init(void)
{  //Enable ADC clock     
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);//不可少   
  
  ADC_DeInit(ADC1);    //设置ADC通道,精度,转换时间   
  ADC_Init(ADC1, ADC_ConversionMode_Single,ADC_Resolution_12Bit, ADC_Prescaler_1);//ADC1,单一模式,12位分辨率   
  ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);//通道和采样率设置   
  ADC_VrefintCmd(ENABLE); //使能内部的VrefintAD功能,测量参考电压   
  ADC_Cmd(ADC1, ENABLE);   
  
}  

你看看吧,也许对你有帮助
clain 回答时间:2015-9-23 16:03:17
void ADC_Periph_Init(ADC_Channel_TypeDef adc_type)
{
  u8 idx;
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);//使能ADC时钟
  CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);//使能DMA1时钟

  ADC_Cmd(ADC1,ENABLE);//打开ADC
   //ADC_DeInit(ADC1);
  for (idx = 0;idx < 50;idx++);//adc上电需要一段时间
  ADC_VrefintCmd(ENABLE);//使能内部参考电压
  
  ADC_DMACmd(ADC1,ENABLE);//使用ADC的DMA功能
  //连续转换模式  ADC_ConversionMode_Continuous,ADC_ConversionMode_Single
   ADC_Init(ADC1, ADC_ConversionMode_Single,ADC_Resolution_12Bit, ADC_Prescaler_2);
  
   ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_384Cycles);                        
                           

  ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);//通道13   PB5
  
  SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);

  DMA_Init(DMA1_Channel0,//通道0
          (uint32_t)&ADC_ConvertedValue,//缓冲区地址
          (uint16_t)ADC1_DR_Address,//ADC数据寄存器地址
          DMA_BUF_SIZE,//缓冲区大小
          DMA_DIR_PeripheralToMemory,//外设到内存
          DMA_Mode_Circular,//循环转换
          DMA_MemoryIncMode_Inc,//内存地址自增
          DMA_Priority_High,//优先级为高
          DMA_MemoryDataSize_HalfWord);//内存数据是半字位宽
   
  DMA_SetCurrDataCounter(DMA1_Channel0,DMA_BUF_SIZE);//设置转速的数据个数

// DMA_ITConfig(DMA1_Channel0,DMA_ITx_TC, ENABLE);//使能传输完成中断
// DMA_ITConfig(DMA1_Channel0,DMA_ITx_HT, DISABLE);
  
  DMA_Cmd(DMA1_Channel0,ENABLE);//使能通道0   
  
  DMA_GlobalCmd(ENABLE);//打开DMA
  
  ADC_SoftwareStartConv(ADC1);//software trigger
}

所属标签

相似问题

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