OpenEdv-开源电子网

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

AD采样频率控制

[复制链接]

3

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-8-31
在线时间
10 小时
发表于 2017-1-23 12:30:53 | 显示全部楼层 |阅读模式
做了一个AD采样然后把数据保存到SD卡的程序,在定时器中断服务函数里得到AD采样值,缓存到一个数组里,达到80个数据之后存到SD卡,现在的问题是采样频率只有120Hz左右,超过这个频率SD卡里面会丢掉许多的数,是因为我在中断函数里执行的语句太多了吗,还是SD卡在存储时自己丢失了数据呢?有没有人做过类似的程序,把采样值存储起来的情况下,采样频率最高能达到多少呢?请多多指教
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-23 12:44:05 | 显示全部楼层
这很好找问题啊,你先不要把80个数据存到SD卡里,直接打印出来,不就知道是你采集的问题,还是写SD卡的问题了?
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-8-31
在线时间
10 小时
 楼主| 发表于 2017-1-23 15:03:58 | 显示全部楼层
lvkanger 发表于 2017-1-23 12:44
这很好找问题啊,你先不要把80个数据存到SD卡里,直接打印出来,不就知道是你采集的问题,还是写SD卡的问题 ...

我查了一下,好像是中断函数运行时间太长了,有什么办法可以解决这个问题吗
回复 支持 反对

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-23 16:02:16 | 显示全部楼层
hande 发表于 2017-1-23 15:03
我查了一下,好像是中断函数运行时间太长了,有什么办法可以解决这个问题吗

你中断里都干嘛了?为啥会运行时间太长?贴下代码吧
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-8-31
在线时间
10 小时
 楼主| 发表于 2017-1-23 16:20:10 | 显示全部楼层
lvkanger 发表于 2017-1-23 16:02
你中断里都干嘛了?为啥会运行时间太长?贴下代码吧

void TIM3_IRQHandler(void)   
{
        static float temp;
        static UINT bw;         /* ????????????? */                       
        static FRESULT ress;
        static FIL file;
  static unsigned char buf[482]="";
        static char zh[6];                                       
  static u8 i=0;

        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  
                {
               
                temp=(float)ADC_ConvertedValue*(3.3/4096);
                printf("%.3f ",temp);

                sprintf(zh,"%.3f",temp);  
                strcat(buf,zh);                          
                strcat(buf," ");                          

                i++;
                if(i>=80){
                 ress = f_open(&file, "0:/data.txt",FA_OPEN_ALWAYS|FA_READ|FA_WRITE );  
          if ( ress == FR_OK )
                  {
                       ress = f_lseek(&file,file.fsize);
                                  ress = f_write(&file, buf, sizeof(buf), &bw);
                      f_close(&file);
                                        i=0;
            }
                memset(buf,0,sizeof(buf));         
                        }
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );          
                }
}
这个就是中断函数
回复 支持 反对

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-23 16:51:39 | 显示全部楼层
hande 发表于 2017-1-23 16:20
void TIM3_IRQHandler(void)   
{
        static float temp;

你在中断里做这么多事儿肯定时间长啊,你用定时器中断置标志就好了,把ADC采样和写SD卡都放到外边去!
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-8-31
在线时间
10 小时
 楼主| 发表于 2017-1-23 16:53:00 | 显示全部楼层
把SD卡存储的程序放主函数中,定时器中断执行的次数是对的,但SD卡里存的数据还是少了一些
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-1 02:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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