OpenEdv-开源电子网

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

3通道ADC1转换,DMA必须有?如何实现定时采样?

[复制链接]

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-10-21 16:14:38 | 显示全部楼层 |阅读模式
5金钱
ADC1转换,3个通道,开启扫描循环模式。
1.DMA必须有?
2.如何实现定时采样?
3.定时器中断处理函数要做什么事?

最佳答案

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

回复【8楼】jiutianshenjian: --------------------------------- 可以同时开多个通道吧,就算不能,周期性扫描就行了。转换完成你要做数据处理,怎样处理,看你自己了。 /* */  extern u8 adc_convert(u8 ch,u16 *adcValue,u16 adcTimes,u16 abortVal,u8 countVal) {         u16 tmp=0;        &nb ...
小小蜗牛
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-10-21 16:14:39 | 显示全部楼层
回复【8楼】jiutianshenjian:
---------------------------------
可以同时开多个通道吧,就算不能,周期性扫描就行了。转换完成你要做数据处理,怎样处理,看你自己了。
/*


*/ 
extern u8 adc_convert(u8 ch,u16 *adcValue,u16 adcTimes,u16 abortVal,u8 countVal)
{
        u16 tmp=0;
        u8  j; 
        static u16      *adc=NULL;
        static u8     adcCount=0;
        static u8     adcTimeCount=0;     
        if(adcCount<countVal)
        {
                       adcCount++; 
        }
        else if(adcCount==countVal)
        { 
                if(adc==NULL)
                {
                        adc=(u16*)calloc(adcTimes,sizeof(u16)); 
                }
                if(adc!=NULL)
                {
                        ADC1->SQR3&=0XFFFFFFE0;//规则序列1 通道ch
ADC1->SQR3|=ch;
ADC1->CR2|=1<<22;       //启动规则转换通道 
                        adcCount++;
                }
        }
        else
        {
                        if((ADC1->SR&(1<<1)))
                        {
                            *(adc+adcTimeCount)=ADC1->DR;     
                        adcTimeCount++; 
                        adcCount=0;
                        if(adcTimeCount==adcTimes)
                        { 
                                for(adcCount=0;adcCount<adcTimes-1;adcCount++)//排序
                                {
                             for(j=adcCount+1;j<adcTimes;j++)
                             {
                            if(*(adc+adcCount)>*(adc+j))//升序排列
                            {
                           tmp=*(adc+adcCount);
                           *(adc+adcCount)=*(adc+j);
                           *(adc+j)=tmp;
                            }
                             }
                                } 
                                tmp=0;   
                                for(adcCount=abortVal;adcCount<adcTimes-abortVal;adcCount++)
                                 tmp+=*(adc+adcCount);
                                *adcValue=tmp/(adcTimes-2*abortVal);
*adcValue/=4; 
if(adc!=NULL)
{
free(adc);
adc=NULL;
}
                                    adcTimeCount=0;
                                    adcCount=0;
                                    return 1;
                        }


                }
                
                                             
        }
return 0;      
}
给个函数给你参考,这个函数没个节拍节拍扫描一次,返回1说明数据处理完成,我的采用去头尾和取平均值的方法进行数据处理。你用的时候,多通道,传递通道数就行了。>
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-10-21 16:47:36 | 显示全部楼层
这个简单,你定时器做个时间,周期性的扫描ADC,比如100MS转换一次,转换多少才后,数据处理,就行了。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-10-21 17:26:17 | 显示全部楼层
回复【2楼】TinyBoy:
---------------------------------
定时器有设置,周期性扫描adc怎么理解?100ms转换一次,是一个通道,还是3个通道。转换的意思是什么?dma怎么控制。
小小蜗牛
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13138
金钱
13138
注册时间
2012-11-26
在线时间
3814 小时
发表于 2014-10-21 17:30:03 | 显示全部楼层
参考原子的ADC  那个没用DMA   
定时去调用就好了  原子的我记得是在循环里一直采集  delay一小会而已
学无止境
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-10-21 17:37:32 | 显示全部楼层
回复【4楼】jermy_z:
---------------------------------
下面这个函数你用过没?想知道dma什么时候读完,就去处理数据,结果这个值一直是最大值不减。
if (!DMA_GetCurrDataCounter(DMA1_Channel1))
小小蜗牛
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-10-21 17:38:53 | 显示全部楼层
回复【3楼】jiutianshenjian:
---------------------------------
ADC属于输入,输入的数据你只要周期性去扫描就行了,100MS采样一次,就是100MS启动ADC一次,就算ADC需要10MS,就是110MS得到一个转换数据,3个通道,如果可以同时独立使用,3个通道都可以100MS转换一次,STM32多通道我没用过,如果不能同时使用,就要切换,如果要切换,你每个通道可以1S转换完成,然后切换,3个通道3S可以转换完成,周期性的时间用定时器完成,没有直接delay.
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13138
金钱
13138
注册时间
2012-11-26
在线时间
3814 小时
发表于 2014-10-21 17:43:24 | 显示全部楼层
回复【5楼】jiutianshenjian:
---------------------------------
没有  我当时有用DMA的循环模式 也就是DMA_Mode_Circular   ,它是一直在那边转换  然后往数组里丢转换数据

然后需要的时候  去读那个数组数据就好了
学无止境
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-10-21 19:49:40 | 显示全部楼层
回复【6楼】TinyBoy:
---------------------------------
多通道,连续转换模式,应该是所有通道转换完成才有eoc。我们如何在每个通道转换完插进去手操作呢?
小小蜗牛
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 02:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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