硬汉嵌入式论坛

 找回密码
 立即注册
查看: 300|回复: 4
收起左侧

[技术讨论] ad7606 fsmc 读数为0

[复制链接]

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2024-4-1 14:41:09 | 显示全部楼层 |阅读模式
本帖最后由 zwt777777 于 2024-4-1 14:46 编辑

移植的ad7606 fsmc的代码

接线应该是没有问题,供电用的单片机的5v,用电压表测过也为5V
但是得到的数据始终为稳定数值 请大佬解答

附接线图

数据图

回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2024-4-1 14:47:59 | 显示全部楼层
/*

c文件
*********************************************************************************************************
*
*        模块名称 : AD7606数据采集模块
*        文件名称 : bsp_fsmc_ad7606.c
*        版    本 : V1.0
*        说    明 : AD7606挂在STM32的FMC总线上,本例子使用了TIM8作为硬件定时器,定时启动ADC转换。
*              AD7606的FMC驱动做了两种采集方式:
*              (1)软件查询方式,适合低速查询获取。
*              (2)FIFO工作模式,适合8路实时采集,支持最高采样率200Ksps。
*
*        修改记录 :
*                版本号  日期        作者     说明
*                V1.0    2020-05-01 armfly  正式发布
*
*        Copyright (C), 2020-2030, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/
#include "bsp.h"



/*
    STM32-V6开发板 + AD7606模块, 控制采集的IO:

    PH9/DCMI_D0/AD7606_OS0                        ---> AD7606_OS0                OS2:OS0 选择数字滤波参数
    PH10/DCMI_D1/AD7606_OS1         ---> AD7606_OS1
    PH11/DCMI_D2/AD7606_OS2         ---> AD7606_OS2
    PH14/DCMI_D4/AD7606_RAGE        ---> AD7606_RAGE        输入模拟电压量程,正负5V或正负10V
    PI4/DCMI_D5/AD7606_RESET        ---> AD7606_RESET        复位
    PI6/DCMI_D6/AD7606_BUSY         ---> AD7606_BUSY        忙信号        (未使用)
    PH12/TIM5_CH3/DCMI_D3/AD7606_CONVST   ---> AD7606_CONVST        启动ADC转换 (CONVSTA 和 CONVSTB 已经并联)

    BUSY--pb7
    CS--PG9 NE2
    RD--PD4
    RST--PE5
    CON--PE6
    RANG--PC7
    OS0--PA4
    OS1--PA6
    OS2--PB6
*/

/* CONVST 启动ADC转换的GPIO = PE6 */
#define CONVST_RCC_GPIO_CLK_ENABLE        __HAL_RCC_GPIOE_CLK_ENABLE
#define CONVST_TIM8_CLK_DISABLE     __HAL_RCC_TIM9_CLK_DISABLE
#define CONVST_GPIO                GPIOE
#define CONVST_PIN                GPIO_PIN_6
#define CONVST_TIMX                TIM9
#define CONVST_TIMCH        2

/* 启动AD转换 */
#define CONVST_1()                CONVST_GPIO->BSRR = CONVST_PIN
#define CONVST_0()                CONVST_GPIO->BSRR = ((uint32_t)CONVST_PIN << 16U)

/* BUSY 转换完毕信号 = PB7 */
#define BUSY_RCC_GPIO_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
#define BUSY_GPIO                GPIOB
#define BUSY_PIN                GPIO_PIN_7
#define BUSY_IRQn                EXTI9_5_IRQn
#define BUSY_IRQHandler        EXTI9_5_IRQHandler

/* 设置过采样的GPIO: PA4 PA6 PB6 */
#define ALL_OS_GPIO_CLK_ENABLE() {\
        __HAL_RCC_GPIOA_CLK_ENABLE();\
        __HAL_RCC_GPIOB_CLK_ENABLE();\
    };

#define OS0_GPIO        GPIOA
#define OS0_PIN                GPIO_PIN_4

#define OS1_GPIO        GPIOA
#define OS1_PIN                GPIO_PIN_6

#define OS2_GPIO        GPIOB
#define OS2_PIN                GPIO_PIN_6

#define OS0_1()                OS0_GPIO->BSRR = OS0_PIN
#define OS0_0()                OS0_GPIO->BSRR= ((uint32_t)OS0_PIN << 16U)
#define OS1_1()                OS1_GPIO->BSRR = OS1_PIN
#define OS1_0()                OS1_GPIO->BSRR = ((uint32_t)OS1_PIN << 16U)
#define OS2_1()                OS2_GPIO->BSRR = OS2_PIN
#define OS2_0()                OS2_GPIO->BSRR = ((uint32_t)OS2_PIN << 16U)

/* 设置输入量程的GPIO : PC7  */
#define RANGE_RCC_GPIO_CLK_ENABLE __HAL_RCC_GPIOC_CLK_ENABLE
#define RANGE_GPIO                GPIOC
#define RANGE_PIN                GPIO_PIN_7

#define RANGE_1()        RANGE_GPIO->BSRR = RANGE_PIN
#define RANGE_0()        RANGE_GPIO->BSRR = ((uint32_t)RANGE_PIN << 16U)

/* AD7606复位口线 : PE5  */
#define RESET_RCC_GPIO_CLK_ENABLE __HAL_RCC_GPIOE_CLK_ENABLE
#define RESET_GPIO                GPIOE
#define RESET_PIN                GPIO_PIN_5

#define RESET_1()        RESET_GPIO->BSRR = RESET_PIN
#define RESET_0()        RESET_GPIO->BSRR = ((uint32_t)RESET_PIN << 16U)

/* AD7606 FSMC总线地址,只能读,无需写 */
#define AD7606_RESULT()        *(__IO uint16_t *)0x64000000

AD7606_VAR_T g_tAD7606;                /* 定义1个全局变量,保存一些参数 */
AD7606_FIFO_T g_tAdcFifo;        /* 定义FIFO结构体变量 */

static void AD7606_CtrlLinesConfig(void);
static void AD7606_FSMCConfig(void);
float ADC_Value[8];         /* 定义1个全局变量,保存采样真实值 */
/*
*********************************************************************************************************
*        函 数 名: bsp_InitAD7606
*        功能说明: 配置连接外部SRAM的GPIO和FSMC
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitAD7606(void)
{
    AD7606_CtrlLinesConfig();
    AD7606_FSMCConfig();

    AD7606_SetOS(AD_OS_NO);    /* 无过采样 */
    AD7606_SetInputRange(1);        /* 0表示输入量程为正负5V, 1表示正负10V */
    AD7606_Reset();                                /* 复位 */
    CONVST_1();                                        /* 启动转换的GPIO,平时设置为高 */
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_CtrlLinesConfig
*        功能说明: 配置GPIO口线,FMC管脚设置为复用功能
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
/*
    安富莱STM32-V5开发板接线方法:

    PD0/FSMC_D2
    PD1/FSMC_D3
    PD4/FSMC_NOE                --- 读控制信号,OE = Output Enable , N 表示低有效
    PD5/FSMC_NWE                --- 写控制信号,AD7606 只有读,无写信号
    PD8/FSMC_D13
    PD9/FSMC_D14
    PD10/FSMC_D15

    PD14/FSMC_D0
    PD15/FSMC_D1

    PE4/FSMC_A20                --- 和主片选一起译码
    PE5/FSMC_A21                --- 和主片选一起译码
    PE7/FSMC_D4
    PE8/FSMC_D5
    PE9/FSMC_D6
    PE10/FSMC_D7
    PE11/FSMC_D8
    PE12/FSMC_D9
    PE13/FSMC_D10
    PE14/FSMC_D11
    PE15/FSMC_D12

    PG12/FSMC_NE4                --- 主片选(TFT, OLED 和 AD7606)

    其他的控制IO:

    PH9/DCMI_D0/AD7606_OS0                        ---> AD7606_OS0                OS2:OS0 选择数字滤波参数
    PH10/DCMI_D1/AD7606_OS1         ---> AD7606_OS1
    PH11/DCMI_D2/AD7606_OS2         ---> AD7606_OS2
    PH12/DCMI_D3/AD7606_CONVST      ---> AD7606_CONVST        启动ADC转换 (CONVSTA 和 CONVSTB 已经并联)
    PH14/DCMI_D4/AD7606_RAGE        ---> AD7606_RAGE        输入模拟电压量程,正负5V或正负10V
    PI4/DCMI_D5/AD7606_RESET        ---> AD7606_RESET        复位
    PI6/DCMI_D6/AD7606_BUSY         ---> AD7606_BUSY        忙信号        (未使用)
*/

static void AD7606_CtrlLinesConfig(void)
{

    GPIO_InitTypeDef gpio_init_structure;

    /* 使能 GPIO时钟 */
    __HAL_RCC_GPIOD_CLK_ENABLE();
    __HAL_RCC_GPIOE_CLK_ENABLE();
    __HAL_RCC_GPIOF_CLK_ENABLE();
    __HAL_RCC_GPIOG_CLK_ENABLE();
    __HAL_RCC_GPIOH_CLK_ENABLE();
    __HAL_RCC_GPIOI_CLK_ENABLE();

    /* 使能FMC时钟 */
    __HAL_RCC_FSMC_CLK_ENABLE();

    /* 设置 GPIOD 相关的IO为复用推挽输出 */
    gpio_init_structure.Mode = GPIO_MODE_AF_PP;
    gpio_init_structure.Pull = GPIO_PULLUP;
    gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    gpio_init_structure.Alternate = GPIO_AF12_FSMC;

    /* 配置GPIOD */
    gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5  |
                                GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_14 |
                                GPIO_PIN_15;
    HAL_GPIO_Init(GPIOD, &gpio_init_structure);

    /* 配置GPIOE */
    gpio_init_structure.Pin =  GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 |
                              GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
    HAL_GPIO_Init(GPIOE, &gpio_init_structure);

    /* 配置GPIOG,FSMC_NE */
    gpio_init_structure.Pin = GPIO_PIN_9;
    HAL_GPIO_Init(GPIOG, &gpio_init_structure);


    /*        配置几个控制用的GPIO
        PH9/DCMI_D0/AD7606_OS0                        ---> AD7606_OS0                OS2:OS0 选择数字滤波参数
        PH10/DCMI_D1/AD7606_OS1         ---> AD7606_OS1
        PH11/DCMI_D2/AD7606_OS2         ---> AD7606_OS2
        PH12/DCMI_D3/AD7606_CONVST      ---> AD7606_CONVST        启动ADC转换
        PH14/DCMI_D4/AD7606_RAGE        ---> AD7606_RAGE        输入模拟电压量程,正负5V或正负10V
        PI4/DCMI_D5/AD7606_RESET        ---> AD7606_RESET        复位

        PI6/DCMI_D6/AD7606_BUSY                        ---> AD7606_BUSY    转换结束的信号
    */

    /* 配置BUSY引脚,默认是普通IO状态 */
    {
        GPIO_InitTypeDef   GPIO_InitStructure;

        __HAL_RCC_SYSCFG_CLK_ENABLE();

        BUSY_RCC_GPIO_CLK_ENABLE();                /* 打开GPIO时钟 */

        /* BUSY信号,使用的PI6,用于转换完毕检测 */
        GPIO_InitStructure.Mode = GPIO_MODE_INPUT;   /* 设置推挽输出 */
        GPIO_InitStructure.Pull = GPIO_NOPULL;       /* 无上拉下拉 */
        GPIO_InitStructure.Pin = BUSY_PIN;
        HAL_GPIO_Init(BUSY_GPIO, &GPIO_InitStructure);
    }

    /* 其它IO */
    {
        GPIO_InitTypeDef   GPIO_InitStructure;
        ALL_OS_GPIO_CLK_ENABLE();
        RANGE_RCC_GPIO_CLK_ENABLE();
        RESET_RCC_GPIO_CLK_ENABLE();
        CONVST_RCC_GPIO_CLK_ENABLE();

        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;                /* 设置推挽输出 */
        GPIO_InitStructure.Pull = GPIO_PULLUP;                                /* 上下拉电阻不使能 */
        GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;    /* GPIO速度等级 */

        GPIO_InitStructure.Pin = CONVST_PIN;
        HAL_GPIO_Init(CONVST_GPIO, &GPIO_InitStructure);

        GPIO_InitStructure.Pin = OS0_PIN;
        HAL_GPIO_Init(OS0_GPIO, &GPIO_InitStructure);

        GPIO_InitStructure.Pin = OS1_PIN;
        HAL_GPIO_Init(OS1_GPIO, &GPIO_InitStructure);

        GPIO_InitStructure.Pin = OS2_PIN;
        HAL_GPIO_Init(OS2_GPIO, &GPIO_InitStructure);

        GPIO_InitStructure.Pin = RANGE_PIN;
        HAL_GPIO_Init(RANGE_GPIO, &GPIO_InitStructure);

        GPIO_InitStructure.Pin = RESET_PIN;
        HAL_GPIO_Init(RESET_GPIO, &GPIO_InitStructure);
    }
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_FSMCConfig
*        功能说明: 配置FSMC并口访问时序
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static void AD7606_FSMCConfig(void)
{
    /*
       TFT-LCD,OLED和AD7606公用一个FMC配置,如果都开启,请以FMC速度最慢的为准。
       从而保证所有外设都可以正常工作。
    */
    SRAM_HandleTypeDef hsram = {0};
    FMC_NORSRAM_TimingTypeDef SRAM_Timing = {0};

    /*
        AD7606规格书要求(3.3V时,通信电平Vdriver):RD读信号低电平脉冲宽度最短21ns,对应FMC的DataSetupTime
        CS片选和RD读信号独立方式的高电平脉冲最短宽度15ns。
        CS片选和RD读信号并联方式的高电平脉冲最短宽度22ns。
        这里将22ns作为最小值更合理些,对应FMC的AddressSetupTime

        4-x-6-x-x-x  : RD高持续35.7ns,低电平持续23.8ns. 读取8路样本数据到内存差不多就是476ns。
    */
    hsram.Instance  = FMC_NORSRAM_DEVICE;
    hsram.Extended  = FMC_NORSRAM_EXTENDED_DEVICE;

    /* FMC使用的HCLK,主频168MHz,1个FMC时钟周期就是5.95ns */
    SRAM_Timing.AddressSetupTime       = 4;  /* 4*5.95ns=23.8ns,地址建立时间,范围0 -15个FMC时钟周期个数 */
    SRAM_Timing.AddressHoldTime        = 0;  /* 地址保持时间,配置为模式A时,用不到此参数 范围1 -15个时钟周期个数 */
    SRAM_Timing.DataSetupTime          = 6;  /* 6*5.95ns=35.7ns,数据保持时间,范围1 -255个时钟周期个数 */
    SRAM_Timing.BusTurnAroundDuration  = 0;  /* 此配置用不到这个参数 */
    SRAM_Timing.CLKDivision            = 0;  /* 此配置用不到这个参数 */
    SRAM_Timing.DataLatency            = 0;  /* 此配置用不到这个参数 */
    SRAM_Timing.AccessMode             = FSMC_ACCESS_MODE_A; /* 配置为模式A */

    hsram.Init.NSBank             = FSMC_NORSRAM_BANK2;              /* 使用的BANK2,即使用的片选FSMC_NE2 */
    hsram.Init.DataAddressMux     = FSMC_DATA_ADDRESS_MUX_DISABLE;   /* 禁止地址数据复用 */
    hsram.Init.MemoryType         = FSMC_MEMORY_TYPE_SRAM;           /* 存储器类型SRAM */
    hsram.Init.MemoryDataWidth    = FSMC_NORSRAM_MEM_BUS_WIDTH_16;        /* 16位总线宽度 */
    hsram.Init.BurstAccessMode    = FSMC_BURST_ACCESS_MODE_DISABLE;  /* 关闭突发模式 */
    hsram.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;   /* 用于设置等待信号的极性,关闭突发模式,此参数无效 */
    hsram.Init.WaitSignalActive   = FSMC_WAIT_TIMING_BEFORE_WS;      /* 关闭突发模式,此参数无效 */
    hsram.Init.WriteOperation     = FSMC_WRITE_OPERATION_ENABLE;     /* 用于使能或者禁止写保护 */
    hsram.Init.WaitSignal         = FSMC_WAIT_SIGNAL_DISABLE;        /* 关闭突发模式,此参数无效 */
    hsram.Init.ExtendedMode       = FSMC_EXTENDED_MODE_DISABLE;      /* 禁止扩展模式 */
    hsram.Init.AsynchronousWait   = FSMC_ASYNCHRONOUS_WAIT_DISABLE;  /* 用于异步传输期间,使能或者禁止等待信号,这里选择关闭 */
    hsram.Init.WriteBurst         = FSMC_WRITE_BURST_DISABLE;        /* 禁止写突发 */
    hsram.Init.ContinuousClock    = FSMC_CONTINUOUS_CLOCK_SYNC_ONLY; /* 仅同步模式才做时钟输出 */
    hsram.Init.WriteFifo          = FSMC_WRITE_FIFO_ENABLE;          /* 使能写FIFO */

    /* 初始化SRAM控制器 */
    if (HAL_SRAM_Init(&hsram, &SRAM_Timing, &SRAM_Timing) != HAL_OK)
    {
        /* 初始化错误 */
        Error_Handler(__FILE__, __LINE__);
    }
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_SetOS
*        功能说明: 配置AD7606数字滤波器,也就设置过采样倍率。
*                          通过设置 AD7606_OS0、OS1、OS2口线的电平组合状态决定过采样倍率。
*                          启动AD转换之后,AD7606内部自动实现剩余样本的采集,然后求平均值输出。
*
*                          过采样倍率越高,转换时间越长。
*                          0、无过采样时,AD转换时间 = 3.45us - 4.15us
*                          1、2倍过采样时 = 7.87us - 9.1us
*                          2、4倍过采样时 = 16.05us - 18.8us
*                          3、8倍过采样时 = 33us - 39us
*                          4、16倍过采样时 = 66us - 78us
*                          5、32倍过采样时 = 133us - 158us
*                          6、64倍过采样时 = 257us - 315us
*
*        形    参: _ucOS : 过采样倍率, 0 - 6
*        返 回 值: 无
*********************************************************************************************************
*/
void AD7606_SetOS(uint8_t _ucOS)
{
    g_tAD7606.ucOS = _ucOS;
    switch (_ucOS)
    {
        case AD_OS_X2:
            OS2_0();
            OS1_0();
            OS0_1();
            break;

        case AD_OS_X4:
            OS2_0();
            OS1_1();
            OS0_0();
            break;

        case AD_OS_X8:
            OS2_0();
            OS1_1();
            OS0_1();
            break;

        case AD_OS_X16:
            OS2_1();
            OS1_0();
            OS0_0();
            break;

        case AD_OS_X32:
            OS2_1();
            OS1_0();
            OS0_1();
            break;

        case AD_OS_X64:
//                                default:
//       g_tAD7606.ucOS = AD_OS_X64;
            OS2_1();
            OS1_1();
            OS0_0();
            break;

        case AD_OS_NO:
        default:
            g_tAD7606.ucOS = AD_OS_NO;
            OS2_0();
            OS1_0();
            OS0_0();
            break;
    }
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_SetInputRange
*        功能说明: 配置AD7606模拟信号输入量程。
*        形    参: _ucRange : 0 表示正负5V   1表示正负10V
*        返 回 值: 无
*********************************************************************************************************
*/
void AD7606_SetInputRange(uint8_t _ucRange)
{
    if (_ucRange == 0)
    {
        g_tAD7606.ucRange = 0;
        RANGE_0();        /* 设置为正负5V */
    }
    else
    {
        g_tAD7606.ucRange = 1;
        RANGE_1();        /* 设置为正负10V */
    }
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_Reset
*        功能说明: 硬件复位AD7606,复位之后恢复到正常工作状态。
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void AD7606_Reset(void)
{
    RESET_0();        /* 退出复位状态 */

    RESET_1();        /* 进入复位状态 */
    RESET_1();        /* 仅用于延迟。 RESET复位高电平脉冲宽度最小50ns。 */
    RESET_1();
    RESET_1();

    RESET_0();        /* 退出复位状态 */
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_StartConvst
*        功能说明: 启动1次ADC转换
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void AD7606_StartConvst(void)
{
    /* page 7:  CONVST 高电平脉冲宽度和低电平脉冲宽度最短 25ns */
    /* CONVST平时为高 */
    CONVST_0();
    CONVST_0();
    CONVST_0();

    CONVST_1();
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_ReadNowAdc
*        功能说明: 读取8路采样结果。结果存储在全局变量 g_tAD7606
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
/* 弱定义,方便用户将采集的结果实时输出 */
__weak void AD7606_SEGGER_RTTOUT(void)
{

}

void AD7606_ReadNowAdc(void)
{
    g_tAD7606.sNowAdc[0] = AD7606_RESULT();        /* 读第1路样本 */
    g_tAD7606.sNowAdc[1] = AD7606_RESULT();        /* 读第2路样本 */
    g_tAD7606.sNowAdc[2] = AD7606_RESULT();        /* 读第3路样本 */
   g_tAD7606.sNowAdc[3] = AD7606_RESULT();        /* 读第4路样本 */
   g_tAD7606.sNowAdc[4] = AD7606_RESULT();        /* 读第5路样本 */
   g_tAD7606.sNowAdc[5] = AD7606_RESULT();        /* 读第6路样本 */
   g_tAD7606.sNowAdc[6] = AD7606_RESULT();        /* 读第7路样本 */
   g_tAD7606.sNowAdc[7] = AD7606_RESULT();        /* 读第8路样本 */

//    AD7606_SEGGER_RTTOUT();
       
       

}

/*
*********************************************************************************************************
*                下面的函数用于定时采集模式。 TIM8硬件定时中断中读取ADC结果,存在全局FIFO
*
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*        函 数 名: AD7606_HasNewData
*        功能说明: 判断FIFO中是否有新数据
*        形    参:  无
*        返 回 值: 1 表示有,0表示暂无数据
*********************************************************************************************************
*/
uint8_t AD7606_HasNewData(void)
{
    if (g_tAdcFifo.usCount > 0)
    {
        return 1;
    }
    return 0;
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_FifoFull
*        功能说明: 判断FIFO是否满
*        形    参: 无
*        返 回 值: 1 表示满,0表示未满
*********************************************************************************************************
*/
uint8_t AD7606_FifoFull(void)
{
    return g_tAdcFifo.ucFull;
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_ReadFifo
*        功能说明: 从FIFO中读取一个ADC值
*        形    参:  _usReadAdc : 存放ADC结果的变量指针
*        返 回 值: 1 表示OK,0表示暂无数据
*********************************************************************************************************
*/
uint8_t AD7606_ReadFifo(uint16_t *_usReadAdc)
{
    if (AD7606_HasNewData())
    {
        *_usReadAdc = g_tAdcFifo.sBuf[g_tAdcFifo.usRead];
        if (++g_tAdcFifo.usRead >= ADC_FIFO_SIZE)
        {
            g_tAdcFifo.usRead = 0;
        }

        DISABLE_INT();
        if (g_tAdcFifo.usCount > 0)
        {
            g_tAdcFifo.usCount--;
        }
        ENABLE_INT();
        return 1;
    }
    return 0;
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_StartRecord
*        功能说明: 开始采集
*        形    参: _ulFreq : 采样频率,单位Hz , 对于AD7606来说,范围1 - 200KHz
*        返 回 值: 无
*********************************************************************************************************
*/
void AD7606_StartRecord(uint32_t _ulFreq)
{
    AD7606_StopRecord();

    AD7606_Reset();                                        /* 复位硬件 */
    AD7606_StartConvst();                        /* 启动采样,避免第1组数据全0的问题 */

    g_tAdcFifo.usRead = 0;                        /* 必须在开启定时器之前清0 */
    g_tAdcFifo.usWrite = 0;
    g_tAdcFifo.usCount = 0;
    g_tAdcFifo.ucFull = 0;

    AD7606_EnterAutoMode(_ulFreq);
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_EnterAutoMode
*        功能说明: 配置硬件工作在自动采集模式,结果存储在FIFO缓冲区。
*        形    参:  _ulFreq : 采样频率,单位Hz,        1k,2k,5k,10k,20K,50k,100k,200k
*        返 回 值: 无
*********************************************************************************************************
*/
void AD7606_EnterAutoMode(uint32_t _ulFreq)
{
    /* 配置PE6为TIM9_CH2功能,输出占空比50%的方波 */
    bsp_SetTIMOutPWM(CONVST_GPIO, CONVST_PIN, CONVST_TIMX,  CONVST_TIMCH, _ulFreq, 5000);

    /* 配置PB7, BUSY 作为中断输入口,下降沿触发 */
    {
        GPIO_InitTypeDef   GPIO_InitStructure;

        BUSY_RCC_GPIO_CLK_ENABLE();        /* 打开GPIO时钟 */
        __HAL_RCC_SYSCFG_CLK_ENABLE();

        GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;        /* 中断下降沿触发 */
        GPIO_InitStructure.Pull = GPIO_NOPULL;
        GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
        GPIO_InitStructure.Pin = BUSY_PIN;
        HAL_GPIO_Init(BUSY_GPIO, &GPIO_InitStructure);

        HAL_NVIC_SetPriority(BUSY_IRQn, 2, 0);
        HAL_NVIC_EnableIRQ(BUSY_IRQn);
    }
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_StopRecord
*        功能说明: 停止采集定时器
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void AD7606_StopRecord(void)
{
    /* 配置PH12 输出低电平,关闭TIM */
    bsp_SetTIMOutPWM(CONVST_GPIO, CONVST_PIN, CONVST_TIMX,  CONVST_TIMCH, 1000, 10000);
    HAL_GPIO_DeInit(CONVST_GPIO, CONVST_PIN);
    CONVST_TIM8_CLK_DISABLE();

    /* CONVST 启动ADC转换的GPIO = PH12*/
    {
        GPIO_InitTypeDef   GPIO_InitStructure;
        CONVST_RCC_GPIO_CLK_ENABLE();

        /* 配置PH12 */
        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;                /* 设置推挽输出 */
        GPIO_InitStructure.Pull = GPIO_NOPULL;                                /* 上下拉电阻不使能 */
        GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;    /* GPIO速度等级 */

        GPIO_InitStructure.Pin = CONVST_PIN;
        HAL_GPIO_Init(CONVST_GPIO, &GPIO_InitStructure);
    }

    CONVST_1();                        /* 启动转换的GPIO平时设置为高 */

    /* 配置BUSY引脚,默认是普通IO状态 */
    {
        GPIO_InitTypeDef   GPIO_InitStructure;

        __HAL_RCC_SYSCFG_CLK_ENABLE();
        BUSY_RCC_GPIO_CLK_ENABLE();                /* 打开GPIO时钟 */

        HAL_GPIO_DeInit(BUSY_GPIO, BUSY_PIN);

        /* BUSY信号,使用的PI6,用于转换完毕检测 */
        GPIO_InitStructure.Mode = GPIO_MODE_INPUT;   /* 设置推挽输出 */
        GPIO_InitStructure.Pull = GPIO_NOPULL;       /* 无上拉下拉 */
        GPIO_InitStructure.Pin = BUSY_PIN;
        HAL_GPIO_Init(BUSY_GPIO, &GPIO_InitStructure);

        HAL_NVIC_DisableIRQ(BUSY_IRQn);
    }
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_ISR
*        功能说明: 定时采集中断服务程序
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
#include "pingPongBuff.h"
extern PINGPONG_BUFF_t ad7606_buff[];
void AD7606_ISR(void)
{
    // uint8_t i;

    AD7606_ReadNowAdc();

    // printf("$%d %d;", g_tAD7606.sNowAdc[0], g_tAD7606.sNowAdc[1]);

    buffDataIn(&ad7606_buff[0], &(g_tAD7606.sNowAdc[0]), 1);
    buffDataIn(&ad7606_buff[1], &(g_tAD7606.sNowAdc[2]), 1);

    // for (i = 0; i < 2; i++)
    // {
    //     g_tAdcFifo.sBuf[g_tAdcFifo.usWrite] = g_tAD7606.sNowAdc;
    //     if (++g_tAdcFifo.usWrite >= ADC_FIFO_SIZE)
    //     {
    //         g_tAdcFifo.usWrite = 0;
    //     }
    //     if (g_tAdcFifo.usCount < ADC_FIFO_SIZE)
    //     {
    //         g_tAdcFifo.usCount++;
    //     }
    //     else
    //     {
    //         g_tAdcFifo.ucFull = 1;                /* FIFO 满,主程序来不及处理数据 */
    //     }
    // }
}

/*
*********************************************************************************************************
*        函 数 名: EXTI9_5_IRQHandler
*        功能说明: 外部中断服务程序。
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
#ifdef EXTI9_5_ISR_MOVE_OUT                /* bsp.h 中定义此行,表示本函数移到 stam32xx_it.c。 避免重复定义 */
void EXTI9_5_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(BUSY_PIN);
}

/*
*********************************************************************************************************
*        函 数 名: EXTI9_5_IRQHandler
*        功能说明: 外部中断服务程序入口, AD7606_BUSY 下降沿中断触发
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == BUSY_PIN)
    {
        AD7606_ISR();
    }
}
#endif

/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2024-4-1 14:49:31 | 显示全部楼层
main文件

初始化开始
int main(void)
{
   HAL_Init();                     //初始化HAL库
    Stm32_Clock_Init(336,8,2,7);    //设置时钟,168Mhz
    delay_init(168);                //初始化延时函数
    uart_init(115200);              //初始化USART
    usmart_dev.init(84);            //初始化USMART
    LED_Init();                     //初始化LED
    KEY_Init();                     //初始化KEY
    LCD_Init();                     //初始化LCD
    MY_ADC_Init();                  //初始化ADC1
    SRAM_Init();                    //初始化外部SRAM
    RTC_Init();                     //初始化RTC
                Motor_Init();                   //电机初始化
    RTC_Set_WakeUp(RTC_WAKEUPCLOCK_CK_SPRE_16BITS,0); //配置WAKE UP中断,1秒钟中断一次
    W25QXX_Init();                  //初始化W25Q128
    bsp_InitAD7606();
    TIM3_Init(1000-1,840-1);        //定时器3初始化,周期10ms
    my_mem_init(SRAMIN);            //初始化内部内存池
    my_mem_init(SRAMEX);            //初始化外部内存池
    my_mem_init(SRAMCCM);           //初始化CCM内存池
    exfuns_init();                  //为fatfs相关变量申请内存
    f_mount(fs[0],"0:",1);          //挂载SD卡
    f_mount(fs[1],"1:",1);          //挂载SPI FLASH.
    f_mount(fs[2],"2:",1);          //重新挂载U盘
                RTC_Set_AlarmA(1,12,0,0);         
    POINT_COLOR=RED;
  
       
       
    g_tAD7606.ucOS = 0;
    AD7606_SetOS(g_tAD7606.ucOS);   /* 设置采样率 */
    AD7606_SetInputRange(1);        /* 0表示输入量程为正负5V, 1表示正负10V */
    AD7606_Reset();                 /* 复位 */
    AD7606_StartConvst();           /* 启动1次转换 */
    // AD7606_StartRecord(AD7606_SampleFreq[g_tAD7606.ucOS]);
    AD7606_StartRecord(200000);

                while(1)
        {
                delay_ms(10);
                 AD7606_ReadNowAdc();          //读取采样的值
                /*转化为真实值*/
    for(int j=0;j<8;j++)
    {
        if(g_tAD7606.sNowAdc[j]>0 ||g_tAD7606.sNowAdc[j]==0)
            ADC_Value[j]=(g_tAD7606.sNowAdc[j]/32767.000)*10.000;
        else
            ADC_Value[j]=(g_tAD7606.sNowAdc[j]/32768.000)*10.000;
    }
    printf("CH1:%.4f,%d\r\n",ADC_Value[0],g_tAD7606.sNowAdc[0]);
          printf("CH2:%.4f,%d\r\n",ADC_Value[1],g_tAD7606.sNowAdc[1]);
          printf("CH3:%.4f,%d\r\n",ADC_Value[2],g_tAD7606.sNowAdc[2]);
   
  }
       
}








回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2024-4-1 15:19:11 | 显示全部楼层
图片没发出去,我的数值就是在0左右,没有任何变化
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2024-4-2 08:18:02 | 显示全部楼层
没有看到你的接线路,特别注意是5V供电。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 19:08 , Processed in 0.514242 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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