OpenEdv-开源电子网

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

为啥stm32读取ads8341最大AD值是32767?求顶

[复制链接]

3

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2020-8-19
在线时间
56 小时
发表于 2021-1-18 16:13:27 | 显示全部楼层 |阅读模式
求顶!!!!按道理来说ads8341是16位采集,最大ad值应该是65535,但是最大显示也才32767。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3397

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8669
金钱
8669
注册时间
2020-5-11
在线时间
4135 小时
发表于 2021-1-18 16:28:41 | 显示全部楼层
专治疑难杂症
回复 支持 反对

使用道具 举报

3

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2020-8-19
在线时间
56 小时
 楼主| 发表于 2021-1-18 16:33:07 | 显示全部楼层
#include "ads8341.h"
#include "spi.h"
#include "delay.h"  
//#include "lcd.h"
//////////////////////////////////////////////////////////////////////////////////         
//ADS8341 采样                                                  
//////////////////////////////////////////////////////////////////////////////////

//初始化CS的IO口
void SPI_AD8341_Init(void)
{       
  GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA, ENABLE);        //PORTA时钟使能

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;      // PA4 推挽
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_SetBits(GPIOA,GPIO_Pin_4);  //默认为高电平

        SPI1_Init();                           //初始化SPI
        SPI1_SetSpeed(SPI_SPEED_256);//设为281.25khz时钟
}

//获取通道ch的转换值
u16 SPI_AD8341_Read_ADVal(u8 ch)   
{  
        u8   S0PDR_H = 0,S0PDR_L = 0;
        u16  S0PDR_HL=0;
        switch(ch)
        {
                case 0:
                        ch = 0x94;
                        break;
                case 1:
                        ch = 0xd4;
                        break;
                default:break;
        }
        SPI_AD8341_CS = 1;  
        delay_us(30);
        SPI_AD8341_CS = 0;                        //使能器件
        delay_us(30);       
        SPI1_ReadWriteByte(ch);    //发送读取状态寄存器命令
   //------判断SPIF是否置位段(发送第1个8位数据)----------
        delay_us(30);  //??
        S0PDR_H = SPI1_ReadWriteByte(0x00);    //发送读取状态寄存器命令   
        S0PDR_H=S0PDR_H<<1;                    //因只有后7位有效
        //------判断SPIF是否置位段(发送第2个8位数据)----------
        delay_us(30);
        S0PDR_L = SPI1_ReadWriteByte(0x00);        //发送任意数据以启动spi时钟         

        if ((S0PDR_L&0X80)!=0)
        {
                S0PDR_H=S0PDR_H|0X01;  //补足高字节最后一位
        }
        S0PDR_L=S0PDR_L<<1; //因只有后7位就低字节有效位
        //------判断SPIF是否置位段(发送第3个8位数据)---------
   delay_us(30);
        SPI1_ReadWriteByte(0x00);

        if ((SPI1->DR & 0X80)!=0)  //读取最低位,如果=1,并补足
        {
                S0PDR_L=S0PDR_L|0X01;  //补足低字节最后一位
        }
        //--取消片选,高低字节组合并返回值段---
        SPI_AD8341_CS = 1;                // 取消片选
        SPI_AD8341_CS = 1;                // 取消片选
        S0PDR_HL = (S0PDR_H<<8) + S0PDR_L;
        return(S0PDR_HL);                   //返回ad值                       
}

/****************************************************************************
* 名称:AdSample()
* 功能:10次采样,去掉最大/最小值,剩余8个取平均值
* 入口参数:ch--->选择通道号
* 出口参数:a--->8个数平均值,原始ad值
****************************************************************************/
//int  AdSample (u8 ch)



//获取通道ch的转换值,取times次,10次采样,去掉最大/最小值,剩余8个取平均值
//ch:通道编号
//times:获取次数
//返回值:通道ch的times次转换结果平均值
u16 read_16bit_pressAD(u8 ch, u8 times)
{  
        u8  i, j;
        u16  a, rcv_data[50];
        u32   rcv_data_float;

  //10次采样
        for(i=0; i<times; i++)
        {      
                rcv_data[i] = 0;
                a = SPI_AD8341_Read_ADVal(ch);
                rcv_data[i] = a;
        }
  
  //10个数排序
        for(j=(times-1); j>0; j--)
        {
                for (i=0; i<j; i++)
                {
                        if (rcv_data[i] > rcv_data[i+1])
                        {
                                a = rcv_data[i+1];
                                rcv_data[i+1] = rcv_data[i];
                                rcv_data[i] = a;
                        }
                }
        }               
  
   //去掉最大/最小值,剩余8个数平均值     
        rcv_data_float = 0;
        for(i=1; i<(times-1); i++)
        {
                rcv_data_float += rcv_data[i];
        }
  
        a = rcv_data_float / (times-2);  //取平均值        
        return a;                          
}


回复 支持 反对

使用道具 举报

3

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2020-8-19
在线时间
56 小时
 楼主| 发表于 2021-1-18 16:33:58 | 显示全部楼层
LcwSwust 发表于 2021-1-18 16:28
敢不敢把程序发上来

已发        
回复 支持 反对

使用道具 举报

12

主题

3397

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8669
金钱
8669
注册时间
2020-5-11
在线时间
4135 小时
发表于 2021-1-18 16:36:28 | 显示全部楼层
本帖最后由 LcwSwust 于 2021-1-18 16:46 编辑

我也曾被其坑过,这家伙的时序有点怪:
傲游截图20210118163506.jpg

我的程序:
傲游截图20210118164544.jpg
专治疑难杂症
回复 支持 反对

使用道具 举报

3

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2020-8-19
在线时间
56 小时
 楼主| 发表于 2021-1-18 18:22:23 | 显示全部楼层
LcwSwust 发表于 2021-1-18 16:36
我也曾被其坑过,这家伙的时序有点怪:

没懂        
回复 支持 反对

使用道具 举报

12

主题

3397

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8669
金钱
8669
注册时间
2020-5-11
在线时间
4135 小时
发表于 2021-1-18 19:29:24 | 显示全部楼层

它输出数据是在时钟下降沿之后
建议先用软件模拟SPI试试.
专治疑难杂症
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 03:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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