当前位置:网站首页>STM32开发 | AD7606并行多路采集数据
STM32开发 | AD7606并行多路采集数据
2022-07-26 04:37:00 【W\Y.】
1、原理图设计参考

2、引脚说明
| 引脚 | 说明 |
|---|---|
| AVCC | 模拟电源电压 4.75 V至5.25 V |
| AGND | 模拟地 |
| OS0/OS1/OS2 | 过采样模式选择 |
| PAR/SER/BYTE | 并行/串行/并行字节接口选择 |
| STBY | 待机模式 |
| RANGE | 模拟输入范围选择(±10V 或 ±5V) |
| CONVST-A / CONVST-B | 开始转换引脚,一般并联在具有PWM功能的引脚上 |
| RESET | 复位引脚 |
| RD/SCLK | 并行接口模式为读取控制引脚(RD) / 串行接口模式下为时钟输入(SCLK) |
| CS | 片选,低电平有效 |
| BUSY | 输出繁忙,低电平时可读取数据 |
| FRSTDATA | 数字输出,表示何时回读数据 |
| REF | 基准电压选择 |
| DB0~DB15 | 16位读取数据输出 |
3、参考代码
#include <stdio.h>
#include <string.h>
#include "stm32f10x.h"
#include "ad7606.h"
//AD7606引脚配置
void AD7606_GPIOConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
// 允许修改RTC和后备寄存器
PWR_BackupAccessCmd(ENABLE);
//关闭外部低速时钟,PC14+PC15可以用作普通IO
RCC_LSEConfig(RCC_LSE_OFF);
//关闭入侵检测功能,PC13作为普通IO
BKP_TamperPinCmd(DISABLE);
//----------------------------- AD7606 DATA GPIO ------------------------------
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 禁止修改RTC和后备寄存器
PWR_BackupAccessCmd(DISABLE);
//------------------------------------ End ------------------------------------
//ADCS->PB3, OS0->PB7, OS1->PB6, OS2->PB5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//ADREAD->PD2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
// COVA->PA8, COVB->PA11, ADRESET->PA13
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//ADFIRST->PA14
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//过采样率设置
void AD7606_SetOS(AD7606_OS_E ucOS)
{
switch (ucOS)
{
case AD_OS_NO: OS2_0(); OS1_0(); OS0_0(); break;
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;
default: OS2_0(); OS1_0(); OS0_0(); break;
}
}
//AD7606初始化
void AD7606Initialization(void)
{
delay_ms(1);
AD7606_RESET_0
AD7606_SetOS(AD_OS_NO);
AD7606_CS_0
AD7606_RD_1
delay_ms(1);
AD7606Reset();
}
//AD7606重置
void AD7606Reset(void)
{
AD7606_RESET_1;
delay_us(1);
AD7606_RESET_0;
delay_us(1);
}
//读取数据
void AD7606ReadSample(void)
{
uint8_t i;
char ad_buffer[20] = {
0};
short ad_value[4] = {
0};
for(i = 0; i < 4; i++)
{
AD7606_RD_0
__NOP();
ad_buffer[i] = READ_AD_DATA;
AD7606_RD_1;
__NOP();
}
sprintf(ad_buffer, "%d %d %d %d ", ad_buffer[0], ad_buffer[1], ad_buffer[2], ad_buffer[3]);
USART2_SendStr(ad_buffer);
}
//频率设置
void PWM_ModeConfig(uint32_t frequency)
{
uint32_t arr_value, psc_value;
//初始化结构体
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//开启端口时钟以及复位时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
//开启定时器时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
//引脚配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* * PWM(Hz) = 72MHz / ((ARR + 1) * (PSC + 1)) * ARR(arr_value) -> TIM_Period * PSC(psc_value) -> TIM_Prescaler */
psc_value = 72 - 1;
arr_value = SystemCoreClock / (psc_value + 1) / frequency - 1;
//计数值,TIM_Period + 1
TIM_TimeBaseStructure.TIM_Period = arr_value;
//预分频值,TIM_Perscaler + 1
TIM_TimeBaseStructure.TIM_Prescaler = psc_value;
//时钟分频因子
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//计数器计数模式,向上计数
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//初始化定时器
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
//PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
//输出使能
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//输出通道电平极性配置
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
//输出比较通道1
TIM_OCInitStructure.TIM_Pulse = 4;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
//输出比较通道4
TIM_OCInitStructure.TIM_Pulse = 4;
TIM_OC4Init(TIM1, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
//允许或禁止在定时器工作时向ARR的缓冲器中写入新值
TIM_ARRPreloadConfig(TIM1, ENABLE);
//使能定时器
TIM_Cmd(TIM1, ENABLE);
//主输出使能,只有在使用高级定时器时有效
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
//busy中断配置
void AD7606_Busy_IRQ(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable GPIOA clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//禁用调试接口
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);
EXTI_InitStructure.EXTI_Line = EXTI_Line15;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
4、头文件
#ifndef _AD7606_H_
#define _AD7606_H_
#include "stm32f01x.h"
#define READ_AD_DATA GPIO_ReadInputData(GPIOC)
#define OS0_1() GPIO_SetBits(GPIOB, GPIO_Pin_6);
#define OS0_0() GPIO_ResetBits(GPIOB, GPIO_Pin_6);
#define OS1_1() GPIO_SetBits(GPIOB, GPIO_Pin_5);
#define OS1_0() GPIO_ResetBits(GPIOB, GPIO_Pin_5);
#define OS2_1() GPIO_SetBits(GPIOB, GPIO_Pin_4);
#define OS2_0() GPIO_ResetBits(GPIOB, GPIO_Pin_4);
#define AD7606_CS_1 GPIO_SetBits(GPIOB, GPIO_Pin_3);
#define AD7606_CS_0 GPIO_ResetBits(GPIOB, GPIO_Pin_3);
#define AD7606_RD_1 GPIO_SetBits(GPIOD, GPIO_Pin_2);
#define AD7606_RD_0 GPIO_ResetBits(GPIOD, GPIO_Pin_2);
#define AD7606_RESET_1 GPIO_SetBits(GPIOA, GPIO_Pin_13);
#define AD7606_RESET_0 GPIO_ResetBits(GPIOA, GPIO_Pin_13);
#define AD7606_CONVST_1 GPIO_SetBits(GPIOA, GPIO_Pin_8 | GPIO_Pin_11);
#define AD7606_CONVST_0 GPIO_ResetBits(GPIOA, GPIO_Pin_8 | GPIO_Pin_11);
#define AD7606_BUSY_STATE GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15)
#define AD7606_FRSTDATA_STATE GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_14)
typedef enum
{
AD_OS_NO = 0,
AD_OS_X2 = 1,
AD_OS_X4 = 2,
AD_OS_X8 = 3,
AD_OS_X16 = 4,
AD_OS_X32 = 5,
AD_OS_X64 = 6
}AD7606_OS_E;
void AD7606Initialization(void);
void AD7606Reset(void);
void AD7606ReadSample(void);
void AD7606_GPIOConfig(void);
void AD7606_PWM_ModeConfig(uint32_t frequency);
void AD7606_SetOS(uint8_t _ucOS);
void AD7606_Busy_IRQ(void);
void AD7606_IRQ_Disable(void);
void AD7606_IRQ_Enable(void);
#endif /*_AD7606_H*/
5、应用
#include "stm32f10x.h"
#include "ad7606.h"
int main(void)
{
AD7606Initialization();
//频率设置20k
AD7606_PWM_ModeConfig(20000);
//设置并进入中断
AD7606_Busy_IRQ();
while(1)
{
}
}
//中断服务函数
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line15) != RESET)
{
AD7606ReadSample();
EXTI_ClearITPendingBit(EXTI_Line15);
}
}
6、中文参考资料下载
链接:https://pan.baidu.com/s/1l4AseVGhHjZcd0mLW5btLQ
提取码:a0ko
边栏推荐
- data warehouse
- egg-sequelize TS编写
- Analyzing the curriculum design evaluation system of steam Education
- 软考回顾及计划
- Kubernetes advanced training camp scheduler
- Cnosdb Nirvana Rebirth: abandon go and fully embrace rust
- 青少年创客教育的创意设计原理
- Recursive implementation of exponential enumeration
- Build a maker Education Laboratory for teenagers
- Array sort 3
猜你喜欢

嵌入式实操----基于RT1170 FreeRTOS实现CPU使用率统计(二十四)

Li Kou daily question - day 42 -661. Picture smoother

FFmpeg 视频添加水印
Yuansaka Lin wallpaper

User defined type details

机器学习之信用卡欺诈检测

Build a maker Education Laboratory for teenagers

I.MX6U-系统移植-6-uboot图形化配置
![[300 + selected interview questions from big companies continued to share] big data operation and maintenance sharp knife interview question column (VIII)](/img/a0/b2b0f5fb63301f5b7dd14302aa39e2.png)
[300 + selected interview questions from big companies continued to share] big data operation and maintenance sharp knife interview question column (VIII)

Is this my vs not connected to the database
随机推荐
Chapter 3 how to use sourcetree to submit code
Several methods of realizing high-low byte or high-low word exchange in TIA botu s7-1200
Build a maker Education Laboratory for teenagers
UE4 two ways to obtain player control
Unable to find sygwin.s file during vscode debugging
egg-sequelize TS编写
Kubernetes 进阶训练营 调度器
数据仓库
青少年创客教育的创意设计原理
FFmpeg 视频编码
MySQL usage
Creative design principle of youth maker Education
Credit card fraud detection based on machine learning
MySQL only checks the reasons for the slow execution of one line statements
Swiftui one day crash
Comparison of the relationship between the number of partitions and the number of reducetask in MapReduce
机器学习之桑基图(用于用户行为分析)
Face database collection summary
11、 Exception handler
Embedded practice -- CPU utilization statistics based on rt1170 FreeRTOS (24)