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

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

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

滤波部分:(均值滤波)
#define N 30
void filter(void)
{
   int  sum = 0;
   u8 count,i;
   for(i=0;i<2;i++)
   {
    for ( count=0;count<N;count++)
    {
       sum += AD_Value[count];
    }
    After_filter=sum/N;
    sum=0;
   }
   
}
采样数据与实际电压/温度转换:
u16 GetTemp(u16 advalue)   
{   
    u32 Vtemp_sensor;   
    s32 Current_Temp;   
      
//    ADC转换结束以后,读取ADC_DR寄存器中的结果,转换温度值计算公式如下:   
//          V25 - VSENSE   
//  T(℃) = ------------  + 25   
//           Avg_Slope   
//   V25:  温度传感器在25℃时 的输出电压,典型值1.43 V。   
//  VSENSE:温度传感器的当前输出电压,与ADC_DR 寄存器中的结果ADC_ConvertedValue之间的转换关系为:   
//            ADC_ConvertedValue * Vdd   
//  VSENSE = --------------------------   
//            Vdd_convert_value(0xFFF)   
//  Avg_Slope:温度传感器输出电压和温度的关联参数,典型值4.3 mV/℃。   
   
    Vtemp_sensor = advalue * 330 / 4096;   
    Current_Temp = (s32)(143 - Vtemp_sensor)*10000/43 + 2500;   
    return (s16)Current_Temp;   
}   
   
u16 GetVolt(u16 advalue)   
{
   
    return (u16)(advalue * 330 / 4096);   
}
滤波部分思路为:ADC正常连续采样三个通道,由DMA进行搬运,一次搬运90个数据,即为1-2-3-1-2-3循环,每个通道各30次,存在 AD_Value[30][3]中,30为每通道30个数据,3为三个通道,根据二维数组存储方式此过程自动完成。而每当一次DMA过程结束后,触发 DMA完成中断,进入滤波函数将30个数据均值成一个, 存入After_filter[3]。整个过程滤波计算需要CPU参与,而在程序中采样结果值随时均为最新,尽力解决程序复杂性和CPU负载。 x=GetVolt(After_filter[0]);即可得到即时电压值。
继承事业,薪火相传
返回列表