- 1、原理图设计参考
- 2、引脚说明
- 3、参考代码
- 4、头文件
- 5、应用
- 6、中文参考资料下载
| 引脚 | 说明 |
|---|---|
| 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位读取数据输出 |
#include4、头文件#include #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); 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; 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); }
#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
串口发送可查看此篇文章
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



