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

新人求助,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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版