STM32驱动-ads1112

汇总一系列AD/DA的驱动程序

ads1112.c

复制代码
#include "ads1112.h"
#include "common.h"

void AD5726_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE );//PORTA、D时钟使能 
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
	GPIO_Init(GPIOA, &GPIO_InitStructure);					
	GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);		
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
	GPIO_Init(GPIOC, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.9
	GPIO_ResetBits(GPIOC,GPIO_Pin_4);
}	

//初始化时,输出电压在中位值,也就是-2.5V---+2.5V中间的0值
//输出的范围由硬件设计决定,详情可以参考ADI公司的datasheet
void AD5726OUT_Init(void)
{
	AD5726_Init();
	AD5726_LDAC_L();
	AD5726_CS_H();
	AD5726_CLR_L();
	AD5726_CLRSEL_H();
}
//模拟SPI通信,方便移植到不同的平台
//input格式:A1 A0 X X D11-----D0
//A1-A0真值表:00--CHA  01--CHB  10--CHC  11--CHD
//CLR-CLRSEL真值表:00--12位寄存器的值为0x000,01--12位寄存器的值为0x800,10和11--12位寄存器不做修改
void SPIWriteByte(u16 data)
{
	u8 i;

	AD5726_CLR_H();
	Delay_us(5);
	AD5726_LDAC_H();
	Delay_us(5);
	AD5726_CLK_H();
	AD5726_CS_H();
	Delay_us(1);
	AD5726_CS_L();
	Delay_us(1);

	for(i =0; i<16; i++)
	{	
		AD5726_CLK_L();		
		Delay_us(1);	
		if(data&0x8000)
			AD5726_DIN_H();
		else
			AD5726_DIN_L();
		AD5726_CLK_H();
		Delay_us(1);

		data<<=1;
	}
	AD5726_CS_H();
	Delay_us(1);

	AD5726_LDAC_L();
	Delay_us(5);

	AD5726_LDAC_H();
	Delay_us(1);
}
void ChannelAOut(uint16_t dac)
{
	u16 xx = dac;
	xx=xx&0x0FFF;
	SPIWriteByte(xx);
}
void ChannelBOut(uint16_t dac)
{
	u16 xx = dac;
	xx=0x4000+(xx&0x0FFF);
	SPIWriteByte(xx);
}
void ChannelCOut(uint16_t dac)
{
	u16 xx = dac;
	xx=0x8000+(xx&0x0FFF);
	SPIWriteByte(xx);
}
void ChannelDOut(uint16_t dac)
{
	u16 xx = dac;
	xx=0xC000+(xx&0x0FFF);
	SPIWriteByte(xx);
}

ads1112.h

复制代码
#ifndef __ADS1112_H
#define __ADS1112_H
#include "stm32f10x.h"   

//LDAC功能描述,当引脚为H时为锁定状态,DAC寄存器的内容不能改变。为L时,寄存器的内容可以改变
//CLRSEL功能描述,确定"CLR非"的动作,如果是高电平 ,将使用一个清除命令将内部DAC寄存器设置成中间值(0X800)。如果是低电平,寄存器将被设置成零(0X000)。
#define AD5726_CS_H()        GPIO_SetBits(GPIOA,GPIO_Pin_4 )
#define AD5726_CLK_H()       GPIO_SetBits(GPIOA,GPIO_Pin_5 )
#define AD5726_DIN_H()       GPIO_SetBits(GPIOA,GPIO_Pin_7 )
#define AD5726_CLRSEL_H()    GPIO_SetBits(GPIOA,GPIO_Pin_1 )
#define AD5726_CLR_H()       GPIO_SetBits(GPIOA,GPIO_Pin_6 )
#define AD5726_LDAC_H()      GPIO_SetBits(GPIOC,GPIO_Pin_4 )

#define AD5726_CS_L()        GPIO_ResetBits(GPIOA,GPIO_Pin_4 )
#define AD5726_CLK_L()       GPIO_ResetBits(GPIOA,GPIO_Pin_5 )
#define AD5726_DIN_L()       GPIO_ResetBits(GPIOA,GPIO_Pin_7 )
#define AD5726_CLRSEL_L()    GPIO_ResetBits(GPIOA,GPIO_Pin_1 )
#define AD5726_CLR_L()       GPIO_ResetBits(GPIOA,GPIO_Pin_6 )
#define AD5726_LDAC_L()      GPIO_ResetBits(GPIOC,GPIO_Pin_4 )

void AD5726_Init(void);
void AD5726OUT_Init(void);
void ChannelAOut(uint16_t dac);
void ChannelBOut(uint16_t dac);
void ChannelCOut(uint16_t dac);
void ChannelDOut(uint16_t dac);
#endif
相关推荐
星一工作室44 分钟前
【STM32模块教程】-TT马达(直流电机)
单片机·嵌入式硬件
jianqiang.xue1 小时前
ESP-IDF保姆级入门19|低功耗模式全解与工程化设计:分级休眠/唤醒源配置/功耗调优/外设适配,实现工业级功耗性能平衡
stm32·单片机·物联网·架构·esp32
单片机仿真设计1 小时前
【proteus仿真】基于 STM32 单片机汽车安全监控装置设计(仿真 + 源码)
stm32·单片机·嵌入式硬件·proteus·毕设
单片机仿真设计1 小时前
【proteus仿真】基于 STM32 单片机的智能浴室系统设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
天空'之城1 小时前
单片机基础核心知识点汇总(二十六)
单片机·嵌入式硬件
新晨单片机设计2 小时前
S005A-基于STM32单片机震动防盗报警器【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus
Jason_zhao_MR2 小时前
Linux与采集MCU通信为什么我们用了双SPI
linux·arm开发·单片机·嵌入式硬件·嵌入式
嵌入式阿蔡2 小时前
云平台设备接入实战:三元组鉴权、属性上报与命令下发(阿里云/华为云)
嵌入式硬件·物联网·嵌入式·存储
liuguomark2 小时前
TMC5160使用问题2
嵌入式硬件·tmc5160
三佛科技-187366133972 小时前
MT8F82XX系列MCU型号选型指南:兼容替代型号全梳理
单片机·嵌入式硬件