首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32 ADC结合DMA数据采样与软件滤波处理(2)

STM32 ADC结合DMA数据采样与软件滤波处理(2)

ADC1配置:(两外部输入,另采样内部温度传感器)
void ADC1_Configuration(void)   
{   
    ADC_InitTypeDef ADC_InitStructure;   
   
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //转换模式为独立,还有交叉等非常多样的选择   
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;   
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  //连续转换开启   
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;   
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   
    ADC_InitStructure.ADC_NbrOfChannel = 3;     //设置转换序列长度为3,三通道   
    ADC_Init(ADC1, &ADC_InitStructure);   
      
    //ADC内置温度传感器使能(要使用片内温度传感器,切忌要开启它)   
    ADC_TempSensorVrefintCmd(ENABLE);   
      
    //常规转换序列1:通道10   
    ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5);   
    //常规转换序列2:通道16(内部温度传感器),采样时间>2.2us,(239cycles)   
    ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 2, ADC_SampleTime_239Cycles5);
     ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 3, ADC_SampleTime_239Cycles5);  
     //输入参数:ADC外设,ADC通道,转换序列顺序,采样时间
    // Enable ADC1   
    ADC_Cmd(ADC1, ENABLE);   
    // 开启ADC的DMA支持(要实现DMA功能,还需独立配置DMA通道等参数)   
    ADC_DMACmd(ADC1, ENABLE);   
      
    // 下面是ADC自动校准,开机后需执行一次,保证精度   
    // Enable ADC1 reset calibaration register   
    ADC_ResetCalibration(ADC1);   
    // Check the end of ADC1 reset calibration register   
    while(ADC_GetResetCalibrationStatus(ADC1));   
   
    // Start ADC1 calibaration   
    ADC_StartCalibration(ADC1);   
    // Check the end of ADC1 calibration   
    while(ADC_GetCalibrationStatus(ADC1));   
    // ADC自动校准结束---------------   
     ADC_SoftwareStartConvCmd(ADC1, ENABLE); //ADC启动   
}  
DMA配置:(无软件滤波)
void DMA_Configuration(void)   
{   
    DMA_InitTypeDef DMA_InitStructure;   
      
    DMA_DeInit(DMA1_Channel1);   
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;   //DMA外设地址,在头部定义
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value;         //内存地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                 //外设至内存模式
    //BufferSize=2,因为ADC转换序列有2个通道   
    //如此设置,使序列1结果放在AD_Value[0],序列2结果放在AD_Value[1]   
    DMA_InitStructure.DMA_BufferSize = 3;                                           //一次转换三个
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   //接受一次后,设备地址不后移
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;        //接受一次后,内存地址后移
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;   //每次传输半字
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;   
    //循环模式开启,Buffer写满后,自动回到初始地址开始传输   
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;   
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;   
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;   
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);   
    //配置完成后,启动DMA通道   
    DMA_Cmd(DMA1_Channel1, ENABLE);   
}
此DMA例程用于单次ADC转换,配合软件滤波可做如下改动:
全局声明:
vu16 AD_Value[30][3];   //AD采样值
vu16 After_filter[3];   //AD滤波后
DMA部分:(带中断滤波)
void DMA_Configuration(void)   
{   
    DMA_InitTypeDef DMA_InitStructure;   
      
    DMA_DeInit(DMA1_Channel1);   
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;   
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value;   
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;   
    //BufferSize=2,因为ADC转换序列有2个通道   
    //如此设置,使序列1结果放在AD_Value[0],序列2结果放在AD_Value[1]   
    DMA_InitStructure.DMA_BufferSize = 90;   
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;   
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;   
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;   
    //循环模式开启,Buffer写满后,自动回到初始地址开始传输   
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;   
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;   
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;   
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);   
    //配置完成后,启动DMA通道   
    DMA_Cmd(DMA1_Channel1, ENABLE);
DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); //使能DMA传输完成中断
   
}
NVIC部分:
  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);          // Enable the DMA Interrupt
stm32f10x_it.c文件:
void DMA1_Channel1_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC1) != RESET)
{
  filter();
  DMA_ClearITPendingBit(DMA1_IT_TC1);
}
}
继承事业,薪火相传
返回列表