设为首页
收藏本站
找回密码
开启辅助访问
登录
注册
只需一步,快速开始
首页
BBS
在线充值
搜索
工控币获得方法
联系方式
搜索
搜索
本版
帖子
用户
工控论坛
»
首页
›
电子技术
›
STM32/8
›
AD7606数据采集模块STM32程序 16位ADC 8路同步 采样频率 ...
返回列表
发新帖
AD7606数据采集模块STM32程序 16位ADC 8路同步 采样频率200KHz 模块
[复制链接]
3
|
0
|
2020-5-21 00:04:36
|
显示全部楼层
|
阅读模式
AD7606挂在STM32的FSMC总线上
STM32F407 FSMC (无工程).zip
(6.71 KB, 售价: 1 工控币)
2020-5-21 00:02 上传
点击文件名下载附件
部分源码
#include "bsp.h"
/* 设置过采样的GPIO: PH9 PH10 PH11 */
#define OS0_1() GPIOH->BSRRL = GPIO_Pin_9
#define OS0_0() GPIOH->BSRRH = GPIO_Pin_9
#define OS1_1() GPIOH->BSRRL = GPIO_Pin_10
#define OS1_0() GPIOH->BSRRH = GPIO_Pin_10
#define OS2_1() GPIOH->BSRRL = GPIO_Pin_11
#define OS2_0() GPIOH->BSRRH = GPIO_Pin_11
/* 启动AD转换的GPIO : PH12 , PH12/TIM5_CH3/DCMI_D3 */
#define CONVST_1() GPIOH->BSRRL = GPIO_Pin_12
#define CONVST_0() GPIOH->BSRRH = GPIO_Pin_12
/* 设置输入量程的GPIO : */
#define RANGE_1() GPIOH->BSRRL = GPIO_Pin_14
#define RANGE_0() GPIOH->BSRRH = GPIO_Pin_14
/* AD7606复位口线 : PI4 */
#define RESET_1() GPIOI->BSRRL = GPIO_Pin_4
#define RESET_0() GPIOI->BSRRH = GPIO_Pin_4
/* AD7606 FSMC总线地址,只能读,无需写 */
#define AD7606_RESULT() *(__IO uint16_t *)0x6C400000
AD7606_VAR_T g_tAD7606; /* 定义1个全局变量,保存一些参数 */
AD7606_FIFO_T g_tAdcFifo; /* 定义FIFO结构体变量 */
static void AD7606_CtrlLinesConfig(void);
static void AD7606_FSMCConfig(void);
/*
*********************************************************************************************************
* 函 数 名: bsp_InitExtSRAM
* 功能说明: 配置连接外部SRAM的GPIO和FSMC
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitAD7606(void)
{
AD7606_CtrlLinesConfig();
AD7606_FSMCConfig();
AD7606_SetOS(AD_OS_NO); /* 无过采样 */
AD7606_SetInputRange(0); /* 0表示输入量程为正负5V, 1表示正负10V */
AD7606_Reset();
CONVST_1(); /* 启动转换的GPIO平时设置为高 */
}
/*
*********************************************************************************************************
* 函 数 名: AD7606_CtrlLinesConfig
* 功能说明: 配置LCD控制口线,FSMC管脚设置为复用功能
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
/*
安富莱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_InitStructure;
/* 使能FSMC时钟 */
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
/* 使能 GPIO时钟 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG, ENABLE);
/* 设置 PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14),
PD.10(D15), PD.14(D0), PD.15(D1) 为复用推挽输出 */
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);
GPIO_InitStructure.GPIO_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;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/*
PE4/FSMC_A20 --- 和主片选一起译码
PE5/FSMC_A21 --- 和主片选一起译码
PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10),
PE.14(D11), PE.15(D12)
*/
GPIO_PinAFConfig(GPIOE, GPIO_PinSource4 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource5 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FSMC);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | 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;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* 设置 PG12 为复用推挽输出 */
GPIO_PinAFConfig(GPIOG, GPIO_PinSource12, GPIO_AF_FSMC);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_Init(GPIOG, &GPIO_InitStructure);
/* 配置几个控制用的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 转换结束的信号
*/
{
/* 使能 GPIO时钟 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH | RCC_AHB1Periph_GPIOI, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14;
GPIO_Init(GPIOH, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_Init(GPIOI, &GPIO_InitStructure);
}
}
/*
*********************************************************************************************************
* 函 数 名: AD7606_FSMCConfig
* 功能说明: 配置FSMC并口访问时序
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
static void AD7606_FSMCConfig(void)
{
FSMC_NORSRAMInitTypeDef init;
FSMC_NORSRAMTimingInitTypeDef timing;
/*
AD7606规格书要求(3.3V时):RD读信号低电平脉冲宽度最短21ns,高电平脉冲最短宽度15ns。
按照如下配置 读数均正常。为了和同BANK的LCD配置相同,选择3-0-6-1-0-0
3-0-5-1-0-0 : RD高持续75ns, 低电平持续50ns. 1us以内可读取8路样本数据到内存。
1-0-1-1-0-0 : RD高75ns,低电平执行12ns左右,下降沿差不多也12ns. 数据读取正确。
*/
/* FSMC_Bank1_NORSRAM4 configuration */
timing.FSMC_AddressSetupTime = 3;
timing.FSMC_AddressHoldTime = 0;
timing.FSMC_DataSetupTime = 6;
timing.FSMC_BusTurnAroundDuration = 1;
timing.FSMC_CLKDivision = 0;
timing.FSMC_DataLatency = 0;
timing.FSMC_AccessMode = FSMC_AccessMode_A;
/*
LCD configured as follow:
- Data/Address MUX = Disable
- Memory Type = SRAM
- Data Width = 16bit
- Write Operation = Enable
- Extended Mode = Enable
- Asynchronous Wait = Disable
*/
init.FSMC_Bank = FSMC_Bank1_NORSRAM4;
init.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
init.FSMC_MemoryType = FSMC_MemoryType_SRAM;
init.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
init.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
init.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
init.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
init.FSMC_WrapMode = FSMC_WrapMode_Disable;
init.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
init.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
init.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
init.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
init.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
init.FSMC_ReadWriteTimingStruct = &timing;
init.FSMC_WriteTimingStruct = &timing;
FSMC_NORSRAMInit(&init);
/* - BANK 1 (of NOR/SRAM Bank 1~4) is enabled */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
}
/*
*********************************************************************************************************
* 函 数 名: AD7606_SetOS
* 功能说明: 配置AD7606数字滤波器,也就设置过采样倍率。
* 通过设置 AD7606_OS0、OS1、OS2口线的电平组合状态决定过采样倍率。
* 启动AD转换之后,AD7606内部自动实现剩余样本的采集,然后求平均值输出。
*
* 过采样倍率越高,转换时间越长。
* 无过采样时,AD转换时间 4us;
* 2倍过采样时 = 8.7us;
* 4倍过采样时 = 16us
* 64倍过采样时 = 286us
*
* 形 参: _ucOS : 过采样倍率
* 返 回 值: 无
*********************************************************************************************************
*/
void AD7606_SetOS(AD7606_OS_E _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:
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
,
采样
,
adc
,
stm32
,
采集
相关帖子
•
STM32F407+OOP+FSM设计思想
•
STM32做平衡小车全套sch原理图pcb电路图文件 C程序代码 BOM表
•
STM32实现U盘功能 USB_Mass_Storage源码
•
STM32串口的LIN从模式代码
•
TKM32F499用DMA存方式1024点ADC采样
•
基于stm32和soem的EtherCAT主站代码
•
STM32+LabVIEW的USB数据采集与显示源程序
•
STM32示波器程序ILI9341_IO模拟源程序+Proteus仿真
•
STM32F407 FLAC软解压 源程序
•
用PROTEUS8.9仿真实现STM32 ADC一路连续转换,值显示在LCD12864上
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
路漫漫
194
主题
199
帖子
74
积分
初级会员
初级会员, 积分 74, 距离下一级还需 426 积分
初级会员, 积分 74, 距离下一级还需 426 积分
工控币
74
加好友
发消息
回复楼主
返回列表
电子技术综合讨论
单片机嵌入式
EDA设计仿真
STM32/8
51单片机
上位机开发及系统管理
Labview
Multisim仿真
图文推荐
350W开关电源原理图及PCB图 元件参数封装图 完整资料可量产
2021-04-04
STM32做平衡小车全套sch原理图pcb电路图文件 C程序代码 BOM表
2021-04-01
三菱FX系列PLC与变频器MODBUS ASCII通信示例程序和文档
2021-03-31
三菱FX2N PLC与三菱变频器ModbusRTU协议通讯应用教程和示例程序
2021-03-31
电镀生产线S7-200 PLC程序带注释
2021-03-25
热门排行
1
LIS3DH中文数据手册
2
STM32F407+OOP+FSM设计思想
3
有偿求iFIX 5.9英文版授权
4
求IFIX5.9授权文件
5
威纶通触摸屏对应的位地址怎么写
6
卡尔曼(kalman)滤波演示程序 c#源码
7
三菱FX5U 以太网CC-LINK BASIC总线控制伺服
8
VC2017+OPENCV4.30实现机器人与传感器的手
9
CISCO QSGMII接口介绍,介绍sgmii接口与QSG
10
西门子STEP7 modbus 软件包分享