OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3705|回复: 5

求分享一个mini版多路ADC采样的程序。

[复制链接]

17

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2016-6-1
在线时间
33 小时
发表于 2016-7-23 15:35:06 | 显示全部楼层 |阅读模式
2金钱
三路以上的最好。一个AD多个通道的。 我自己配的时候有错误,不知道哪有问题,想参考下大家的程序

最佳答案

查看完整内容[请看2#楼]

http://www.openedv.com/forum.php?mod=viewthread&tid=72717&highlight=ad
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2878
金钱
2878
注册时间
2016-6-17
在线时间
321 小时
发表于 2016-7-23 15:35:07 | 显示全部楼层
回复

使用道具 举报

7

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2016-4-10
在线时间
48 小时
发表于 2016-7-23 23:39:37 | 显示全部楼层
其实我写多路的时候也有问题  自己想办法解决是最好的   不能一直参考别人的程序    注意下通道  跟引脚配置
回复

使用道具 举报

5

主题

19

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-7-5
在线时间
11 小时
发表于 2016-7-24 14:19:19 | 显示全部楼层
翻我帖子
回复

使用道具 举报

3

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2878
金钱
2878
注册时间
2016-6-17
在线时间
321 小时
发表于 2016-7-24 14:30:29 | 显示全部楼层
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "adc.h"
#include "dma.h"
/////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ADC1的0通道--7通道测试
//作者;jia
//创建日期:2016年4月19日21:44:43
//部分程序引用@正点原子@开源网网友JJ
//对此程序如有疑问或建议,可发邮箱至 jiayubao12@163.com
//////////////////////////////////////////////////////////////////////////////////         

#define N 50 //取50次平均值
#define M 8 //8路AD
u16 value[N][M];//存储ADC转换后N*M个数字量的数据
u16 aftervalue[M];//存储M个通道数字量的平均值
float avalue[M];//滤波后的通道采样电压值
u8 i=0,j=0;

////////////////滤波函数/////////////////////////////////////////////////////////////////////////                       
void filter(void)
{
        int sum = 0;//sum 通道采样数值的总和
        u8 count;//
        for(i=0;i<M;i++)//每个通道进行循环滤波
        {
                for(count=0;count<N;count++)//采样N次循环
                {
                         sum+=value[count];//计算出N次采样值的总和
    }
    aftervalue=sum/N;//求出通道数字量的平均值
    sum=0;//清零便于下次重新计算
  }
}
/////////////////////////////主程序////////////////////////////////////////////////////////////       
/////////////////////////////主程序////////////////////////////////////////////////////////////       
int main(void)
{
        u8 x=0;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        delay_init();                     //延时函数初始化          
        uart_init(9600);                 //串口初始化为9600
        LED_Init();                                  //初始化与LED连接的硬件接口
        LCD_Init();
        Adc_Init();                                  //ADC初始化
        POINT_COLOR=RED;//设置字体为红色
        LCD_ShowString(60,8,200,16,16,"Mini STM32");       
        LCD_ShowString(60,24,200,16,16,"ADC+DMA TEST");       

        //显示提示信息
        POINT_COLOR=BLUE;//设置字体为蓝色
        LCD_ShowString(60,40,200,16,16,"ADC_CH0_VAL:");
        LCD_ShowString(60,56,200,16,16,"ADC_CH1_VAL:");
        LCD_ShowString(60,72,200,16,16,"ADC_CH2_VAL:");
        LCD_ShowString(60,88,200,16,16,"ADC_CH3_VAL:");          
        LCD_ShowString(60,104,200,16,16,"ADC_CH4_VAL:");
        LCD_ShowString(60,120,200,16,16,"ADC_CH5_VAL:");
        LCD_ShowString(60,136,200,16,16,"ADC_CH6_VAL:");
        LCD_ShowString(60,152,200,16,16,"ADC_CH7_VAL:");         
        POINT_COLOR=BRRED;
        LCD_ShowString(60,168,200,16,16,"ADC_CH0_VOL:0.000V");       
        LCD_ShowString(60,184,200,16,16,"ADC_CH1_VOL:0.000V");       
        LCD_ShowString(60,200,200,16,16,"ADC_CH2_VOL:0.000V");       
        LCD_ShowString(60,216,200,16,16,"ADC_CH3_VOL:0.000V");       
        LCD_ShowString(60,232,200,16,16,"ADC_CH4_VOL:0.000V");       
        LCD_ShowString(60,248,200,16,16,"ADC_CH5_VOL:0.000V");       
        LCD_ShowString(60,264,200,16,16,"ADC_CH6_VOL:0.000V");       
        LCD_ShowString(60,280,200,16,16,"ADC_CH7_VOL:0.000V");       
         
        MYDMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)&value,M*N);//初始化DMA
        ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件打开ADC转换
        DMA_Cmd(DMA1_Channel1, ENABLE);        //打开DMA功能

  while(1)
        {               
                filter();//滤波,此处函数一定不能省,否则ADC不能正常工作
                POINT_COLOR=BLUE;//设置字体为蓝色
                LCD_ShowxNum(156,40,aftervalue[0],4,16,0);//显示ADC的值       
                LCD_ShowxNum(156,56,aftervalue[1],4,16,0);//显示ADC的值       
                LCD_ShowxNum(156,72,aftervalue[2],4,16,0);//显示ADC的值       
                LCD_ShowxNum(156,88,aftervalue[3],4,16,0);//显示ADC的值                       
                LCD_ShowxNum(156,104,aftervalue[4],4,16,0);//显示ADC的值       
                LCD_ShowxNum(156,120,aftervalue[5],4,16,0);//显示ADC的值       
                LCD_ShowxNum(156,136,aftervalue[6],4,16,0);//显示ADC的值       
                LCD_ShowxNum(156,152,aftervalue[7],4,16,0);//显示ADC的值
               
///////////////计算出每个通道数字量对应的电压值的整数部分/////
                for(i=0;i<M;i++)
                {
       avalue=(float)aftervalue*(3.3/4096);
                         aftervalue=avalue;
    }

/////////////////显示整数部分/////////////////////               
                POINT_COLOR=BRRED;
                LCD_ShowxNum(156,168, aftervalue[0],1,16,0);//显示电压值
                LCD_ShowxNum(156,184, aftervalue[1],1,16,0);//显示电压值
                LCD_ShowxNum(156,200, aftervalue[2],1,16,0);//显示电压值
                LCD_ShowxNum(156,216, aftervalue[3],1,16,0);//显示电压值
                LCD_ShowxNum(156,232, aftervalue[4],1,16,0);//显示电压值
                LCD_ShowxNum(156,248, aftervalue[5],1,16,0);//显示电压值
                LCD_ShowxNum(156,264, aftervalue[6],1,16,0);//显示电压值
                LCD_ShowxNum(156,280, aftervalue[7],1,16,0);//显示电压值
               
//////////////计算出每个通道数字量对应的电压值的小数部分///////
                for(i=0;i<M;i++)
                {
       avalue-=aftervalue;
                         avalue*=1000;//放大1000倍进行显示
    }
/////////////////显示小数部分////////////////////               
                        LCD_ShowxNum(172,168,avalue[0],3,16,0X80);
                        LCD_ShowxNum(172,184,avalue[1],3,16,0X80);
                        LCD_ShowxNum(172,200,avalue[2],3,16,0X80);
                        LCD_ShowxNum(172,216,avalue[3],3,16,0X80);
                        LCD_ShowxNum(172,232,avalue[4],3,16,0X80);
                        LCD_ShowxNum(172,248,avalue[5],3,16,0X80);
                        LCD_ShowxNum(172,264,avalue[6],3,16,0X80);
                        LCD_ShowxNum(172,280,avalue[7],3,16,0X80);
                x++;
                if(x==12)x=0;
                LED0=!LED0;         
                delay_ms(200);                       
        }               
          
}
回复

使用道具 举报

3

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2878
金钱
2878
注册时间
2016-6-17
在线时间
321 小时
发表于 2016-7-24 14:31:08 | 显示全部楼层
#include "adc.h"
#include "delay.h"
#define M 8 //8路AD
/////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ADC1的0通道--7通道测试
//作者;jia
//创建日期:2016年4月19日21:44:43
//部分程序引用@正点原子@开源网网友JJ
//对此程序如有疑问或建议,可发邮箱至 jiayubao12@163.com
//////////////////////////////////////////////////////////////////////////////////       
          
                  
//初始化ADC
//开启ADC1的通道0~7,对应关系如下
//ADC1_CH0-->PA0       
//ADC1_CH1-->PA1       
//ADC1_CH2-->PA2
//ADC1_CH3-->PA3       
//ADC1_CH4-->PA4       
//ADC1_CH5-->PA5       
//ADC1_CH6-->PA6
//ADC1_CH7-->PA7

void  Adc_Init(void)
{        
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1,ENABLE);          //使能ADC1通道时钟


        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

        //PA0-7 作为模拟通道输入引脚                        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
        GPIO_Init(GPIOA, &GPIO_InitStructure);       

        ADC_DeInit(ADC1);  //复位ADC1

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
        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数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = M;        //顺序进行规则转换的ADC通道的数目
        ADC_Init(ADC1, &ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   

        ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );        //配置采样时间为239.5周期
        ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 );        //配置采样时间为239.5周期
  ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 );        //配置采样时间为239.5周期
        ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5 );        //配置采样时间为239.5周期       
  ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_239Cycles5 );        //配置采样时间为239.5周期
        ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_239Cycles5 );        //配置采样时间为239.5周期       
  ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7, ADC_SampleTime_239Cycles5 );        //配置采样时间为239.5周期
        ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 8, ADC_SampleTime_239Cycles5 );        //配置采样时间为239.5周期
  
        ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
        ADC_DMACmd(ADC1, ENABLE);//使能ADC1的DMA通道
       
        ADC_ResetCalibration(ADC1);        //使能复位校准           
        while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束
        ADC_StartCalibration(ADC1);         //开启AD校准
        while(ADC_GetCalibrationStatus(ADC1));         //等待校准结束

}                                  





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 17:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表