OpenEdv-开源电子网

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

从ADC读取数据写入SD卡

[复制链接]

1

主题

6

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2017-6-28
在线时间
2 小时
发表于 2017-6-28 08:57:17 | 显示全部楼层 |阅读模式
1金钱
为什么一直重复在写第一次读取的数据呢?不会写新读到的数据?while(1)
        {
         ADC_Vol =(float) ADC_ConvertedValue/4096*(float)3.3; // 读取转换的AD值
        printf("\r\n The current AD value = %d\n \r\n", ADC_ConvertedValue);
        printf("\r\n The current AD value = %f V \r\n",ADC_Vol);     
        Delay(0x8fffff);  
                  
                  sprintf(dataTemp, "%.3f \r\n",ADC_Vol);  // 将 ADC_Vol 以字符串的形式,写入到字符串数组dataTemp中
                   res = f_open(&fdst,"0:/Data4.txt", FA_WRITE | FA_OPEN_ALWAYS);//以写和追加的方式打开文件
                  if ( res == FR_OK )
                         {
                                        f_lseek(&fdst, f_size(&fdst)); //将文件指针移动到文件末尾
                                        res = f_write(&fdst, &dataTemp, sizeof(dataTemp), &bw); // 将缓冲区的数据写到文件中,将字符串数组dataTemp写入SD卡
                                        printf( "\r\n 数据写入成功 \n" );   
                                        f_close(&fdst);   //关闭文件   
                                }                       
          
               
                t++;
                delay_ms(200);                                           
                LED0_Toggle;
        }                                                                          
}



最佳答案

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

res = f_write(&fdst, &dataTemp, sizeof(dataTemp), &bw); // 将缓冲区的数据写到文件中,将字符串数组dataTemp写入SD卡,把&dataTemp去掉&
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-7-7
在线时间
110 小时
发表于 2017-6-28 08:57:18 | 显示全部楼层
res = f_write(&fdst, &dataTemp, sizeof(dataTemp), &bw); // 将缓冲区的数据写到文件中,将字符串数组dataTemp写入SD卡,把&dataTemp去掉&
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2017-6-28
在线时间
2 小时
 楼主| 发表于 2017-6-28 10:38:38 | 显示全部楼层
zhang00956 发表于 2017-6-28 09:21
res = f_write(&fdst, &dataTemp, sizeof(dataTemp), &bw); // 将缓冲区的数据写到文件中,将字符串数组dat ...

还是不行啊,请问可能是哪里的问题?
捕获.JPG
回复

使用道具 举报

10

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-7-7
在线时间
110 小时
发表于 2017-6-28 10:44:41 | 显示全部楼层
zxf 发表于 2017-6-28 10:38
还是不行啊,请问可能是哪里的问题?

先用串口把采集的数据一个一个打印出来,如果打印出来没错说明错在写入sd,如果打印都有问题,说明错误应该在AD采样赋值这里
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2017-6-28
在线时间
2 小时
 楼主| 发表于 2017-6-28 12:13:00 | 显示全部楼层
zhang00956 发表于 2017-6-28 10:44
先用串口把采集的数据一个一个打印出来,如果打印出来没错说明错在写入sd,如果打印都有问题,说明错误应 ...

发现是ADC采样赋值的问题,能再帮我看一下吗?
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "sdram.h"
#include "w25qxx.h"
#include "nand.h"  
#include "mpu.h"
#include "sdmmc_sdcard.h"
#include "usmart.h"
#include "malloc.h"
#include "ftl.h"  
#include "ff.h"
#include "exfuns.h"
#include "./adc/bsp_adc.h"
// #include "./usart/bsp_usart.h"
#include "stdio.h"
#include "stm32f7xx.h"
/************************************************
ALIENTEK 阿波罗STM32F7开发板 实验42
FATFS实验-HAL库函数版
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司  
作者:正点原子 @ALIENTEK
************************************************/

// ADC1转换的电压值通过MDA方式传到SRAM
extern __IO uint16_t ADC_ConvertedValue;

// 局部变量,用于保存转换计算后的电压值          
float ADC_Vol;
// 以下来自FATFS 程序
FIL fsrc,fdst;
// UINT br, bw;            // File R/W count 已经在exfuns.c 中定义过了
BYTE buffer[512];       // file copy buffer
BYTE textFileBuffer[] = "TIME | ADC_Value \r\n";
// float dataBuffer[4] = {11.10,11.21,4.542,415.3};
char dataTemp[40];
// 以上来自FATFS 程序

static void Delay(__IO uint32_t nCount)         //简单的延时函数
{
        for(; nCount != 0; nCount--);
}

int main(void)
{
        u32 total,free;
        u8 t=0;       
        u8 res=0;       
  float ADC_BUF[512];
  int i,j;
       
       
  
  Cache_Enable();                 //打开L1-Cache
    MPU_Memory_Protection();        //保护相关存储区域
    HAL_Init();                                        //初始化HAL库
    Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz
    delay_init(216);                //延时初始化
          
        uart_init(115200);                        //串口初始化
        usmart_dev.init(108);                     //初始化USMART
        Rheostat_Init();
  
  LED_Init();                     //初始化LED
    KEY_Init();                     //初始化按键
    SDRAM_Init();                   //初始化SDRAM
    LCD_Init();                     //初始化LCD
    W25QXX_Init();                                    //初始化W25Q256

        my_mem_init(SRAMIN);                    //初始化内部内存池
        my_mem_init(SRAMEX);                    //初始化外部内存池
        my_mem_init(SRAMDTCM);                    //初始化CCM内存池
           POINT_COLOR=RED;
        LCD_ShowString(30,50,200,16,16,"Apollo STM32F4/F7");
        LCD_ShowString(30,70,200,16,16,"FATFS TEST");       
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2016/7/15");                  
        LCD_ShowString(30,130,200,16,16,"Use USMART for test");             
        while(SD_Init())//检测不到SD卡
        {
                LCD_ShowString(30,150,200,16,16,"SD Card Error!");
                delay_ms(500);                                       
                LCD_ShowString(30,150,200,16,16,"Please Check! ");
                delay_ms(500);
                LED0_Toggle;//DS0闪烁
        }
       

  FTL_Init();
        exfuns_init();                                                        //为fatfs相关变量申请内存                                 
  f_mount(fs[0],"0:",1);                                         //挂载SD卡

// 以下程序,在data.txt中写入一行字符串。
        res = f_open(&fdst,"0:/Data4.txt", FA_WRITE | FA_OPEN_ALWAYS);//以写和追加的方式打开文件
        if ( res == FR_OK )
        {
    f_lseek(&fdst, f_size(&fdst)); //将文件指针移动到文件末尾
                res = f_write(&fdst, textFileBuffer, sizeof(textFileBuffer), &bw); // 将缓冲区的数据写到文件中
                printf( "\r\n 文件创建成功 \n" );   
                f_close(&fdst);  //关闭文件   
  }         
        // 以上程序,在data.txt中写入一行字符串。
       
  LCD_Fill(30,150,240,150+16,WHITE);                //清除显示                          
        while(exf_getfree("0:",&total,&free))        //得到SD卡的总容量和剩余容量
        {
                LCD_ShowString(30,150,200,16,16,"SD Card Fatfs Error!");
                delay_ms(200);
                LCD_Fill(30,150,240,150+16,WHITE);        //清除显示                          
                delay_ms(200);
                LED0_Toggle;//DS0闪烁
        }                                                                                                                                      
        POINT_COLOR=BLUE;//设置字体为蓝色          
        LCD_ShowString(30,150,200,16,16,"FATFS OK!");         
        LCD_ShowString(30,170,200,16,16,"SD Total Size:     MB");         
        LCD_ShowString(30,190,200,16,16,"SD  Free Size:     MB");             
        LCD_ShowNum(30+8*14,170,total>>10,5,16);        //显示SD卡总容量 MB
        LCD_ShowNum(30+8*14,190,free>>10,5,16);     //显示SD卡剩余容量 MB                            
        // j=0;
       
        while(1)
        {
                 ADC_Vol =(float) ADC_ConvertedValue/4096*(float)3.3; // 读取转换的AD值
        printf("\r\n The current AD value = %d\n \r\n", ADC_ConvertedValue);
        printf("\r\n The current AD value = %f V \r\n",ADC_Vol);     
        Delay(0x8fffff);  
                  
                  sprintf(dataTemp, "%.3f \r\n",ADC_Vol);  // 将 ADC_Vol 以字符串的形式,写入到字符串数组dataTemp中
                   res = f_open(&fdst,"0:/Data4.txt", FA_WRITE | FA_OPEN_ALWAYS);//以写和追加的方式打开文件
                  if ( res == FR_OK )
                         {
                                        f_lseek(&fdst, f_size(&fdst)); //将文件指针移动到文件末尾
                                        res = f_write(&fdst, &dataTemp, sizeof(dataTemp), &bw); // 将缓冲区的数据写到文件中,将字符串数组dataTemp写入SD卡
                                        printf( "\r\n 数据写入成功 \n" );   
                                        f_close(&fdst);   //关闭文件   
                                }                       
          
               
                t++;
                delay_ms(200);                                           
                LED0_Toggle;
        }                                                                          
}
回复

使用道具 举报

10

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-7-7
在线时间
110 小时
发表于 2017-6-28 12:57:31 | 显示全部楼层
zxf 发表于 2017-6-28 12:13
发现是ADC采样赋值的问题,能再帮我看一下吗?
#include "sys.h"
#include "delay.h"

你在采样的时候,有没有调过电压,如果没调过,那肯定是相同的值
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2017-6-28
在线时间
2 小时
 楼主| 发表于 2017-6-28 13:18:01 | 显示全部楼层
zhang00956 发表于 2017-6-28 12:57
你在采样的时候,有没有调过电压,如果没调过,那肯定是相同的值

确定是调了电压的
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2017-6-28
在线时间
2 小时
 楼主| 发表于 2017-6-28 13:55:16 | 显示全部楼层
zhang00956 发表于 2017-6-28 12:57
你在采样的时候,有没有调过电压,如果没调过,那肯定是相同的值

解决了,谢谢您!
回复

使用道具 举报

10

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-7-7
在线时间
110 小时
发表于 2017-6-28 13:57:37 | 显示全部楼层
zxf 发表于 2017-6-28 13:55
解决了,谢谢您!

哪里出错了?
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2017-6-28
在线时间
2 小时
 楼主| 发表于 2017-6-28 21:47:13 | 显示全部楼层

  ADC_Vol =(float) ADC_ConvertedValue/4096*(float)3.3; // 读取转换的AD值
这一行有问题,一直重复读取第一个数据,参考别的例程修改了一下就好了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-6-14
在线时间
0 小时
发表于 2019-6-14 09:24:27 | 显示全部楼层
请问楼主用的是哪个型号的单片机,如果可以的话,我能参考一下您的完整程序吗,就是从采样到将数据存储到SD卡
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-9 03:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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