蓝桥杯单片机——DAC转换输出电压

本文介绍了一个基于DAC的输出模式控制系统,包括三种模式:固定电压输出和实时同步显示。模式1输出2.00V,模式2输出4.00V,模式3则根据PCF8591芯片AIN3通道的输入电压动态调整。系统通过独立按键S4进行模式切换,每次按下S4,模式会在1到3之间循环。程序中详细展示了如何读取和设置PCF8591的AIN3通道,以及如何更新DAC的输出电压和数码管的显示内容。
摘要由CSDN通过智能技术生成

(注:题目来源,小蜜蜂老师)

原文链接:https://blog.csdn.net/ohy3686/article/details/123969207

  DAC的输出模式有3种。
    模式1中,数码管左边显示“-1-”,DAC输出固定电压2.00V。
    模式2中,数码管左边显示“-2-”,DAC输出固定电压4.00V。
    模式3中,数码管左边显示“-3-”,数码管右边显示PCF8591芯片AIN3通道的实时输入电压,并将该电压作为DAC的输出参数,使DAC的输出电压和PCF8591芯片AIN3通道的输入电压保持同步变化,通过改变Rb2可调电阻可以改变DAC的输出电压。

J5配置BTN模式,把S4设置为独立按键,选择DAC的输出模式。

在模式1中按下S4按键,进入模式2;在模式2中按下S4按键,进入模式3;在模式3中按下S4按键,重新回到模式1,如此循环。

 初始状态:系统上电后,工作在模式1。

#include <reg52.h>
#include <iic.h>
sbit s4=P3^3;
unsigned char code smg_nodot[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code smg_dot[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned int dat_rb2=0;//电压转换数据
unsigned char dat=0;//采样数据
unsigned char flag_s4=0;//模式切换按键标志
unsigned char num=1;//模式号数
void delaysmg(unsigned int t)
{
	while(t--);
}
void displaysmg_byte(unsigned char pos,unsigned char value)
{
	P2=0XE0;P0=0XFF;
	P2=0XC0;P0=0X01<<pos;
	P2=0XE0;P0=value;
}
void display()
{
  displaysmg_byte(0,0xbf);
  delaysmg(100);
  displaysmg_byte(1,smg_nodot[num]);
  delaysmg(100);
  displaysmg_byte(2,0xbf);
  delaysmg(100);
  displaysmg_byte(5,smg_dot[dat_rb2/100]);
  delaysmg(100);
  displaysmg_byte(6,smg_nodot[(dat_rb2/10)%10]);
  delaysmg(100);
  displaysmg_byte(7,smg_nodot[dat_rb2%10]);
  delaysmg(100);
  P2=0XC0;P0=0XFF;
  P2=0XE0;P0=0XFF;
}
void read_rb2()
{
  IIC_Start();
  IIC_SendByte(0x90);
  IIC_WaitAck();
  IIC_SendByte(0x43);
  IIC_WaitAck();
  IIC_Stop();

  IIC_Start();
  IIC_SendByte(0x91);
  IIC_WaitAck();
  dat=IIC_RecByte();
  IIC_WaitAck();
  IIC_SendAck(1);
  IIC_Stop();

  dat_rb2=dat*(5.0/255)*100;
}
void set_rb2_dac(unsigned char dat)
{
  IIC_Start();
  IIC_SendByte(0x90);
  IIC_WaitAck();
  IIC_SendByte(0x43); 	//输出DAC,转换AIN3	
  IIC_WaitAck();
  IIC_SendByte(dat);
  IIC_WaitAck();
  IIC_Stop();	
}

void key()
{
	if(s4==0)
	{
	  delaysmg(100);
	  if(s4==0)
	  {
	  	 while(s4==0)
		 {
			display();
		 }
		 flag_s4++;
		 if(flag_s4==3)
		 {
			flag_s4=0;
		 }
	  }
	}
}
void displaysmg()
{
  switch(flag_s4)
  {
  	case 0: //模式1
			num=1;
			dat_rb2=200;
			set_rb2_dac(102);
			display();break;
	case 1://模式2
			num=2;
			dat_rb2=400;
			set_rb2_dac(204);
			display();break;
	case 2://模式3
			num=3;
			read_rb2();
			set_rb2_dac(dat_rb2);
			display();break;
  }
}
void main()
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
	while(1)
	{
	 	key();
		displaysmg();
	}
}



 

STM32F407单片机16bit_DAC_AD5689模拟量(-10V~10V)电压输出实验KEIL工程源码: int main(void) { uint16_t data=0xFFFF/2; double temp,opa; /* 复位所有外设,初始化Flash接口和系统滴答定时器 */ HAL_Init(); /* 配置系统时钟 */ SystemClock_Config(); /* 初始化串口并配置串口中断优先级 */ MX_DEBUG_USART_Init(); KEY_GPIO_Init(); printf("硬石DAC(AD5689)模块模拟量电压输出测试\n"); AD5689_Init(); AD5689_WriteUpdate_DACREG(DAC_A,data); AD5689_WriteUpdate_DACREG(DAC_B,0xFFFF-data); printf("data:%d\n",data); opa=OPA_RES_R2/OPA_RES_R1; while(1) { if(KEY1_StateRead()==KEY_DOWN) { if(data>(0xFFFF-1000)) data=(0xFFFF-1000); data +=1000; AD5689_WriteUpdate_DACREG(DAC_A,data); AD5689_WriteUpdate_DACREG(DAC_B,0xFFFF-data); temp=(double)(data*2-0xFFFF)*2500*opa/0xFFFF; //temp为目标电源值,这里先放大1000倍(方便计算而已),等后面显示再还原 //data是数字量DA值,当data取值为:0~0xFFFF对应AD5689输出为0~5V //本例程是输出-10V~10V,这个功能主要是靠运放实现,特殊的电路使得: //AD5689输出0V时对应运放输出-10V,AD5689输出2.5V对应运放输出0V,AD5689输出5V对应运放输出10V //(上面虽说是10V,实际上应该是 2.5V*opa(运放放大倍数),这里opa=40.2K/10K=4.02) //所以使得程序:data值为0时运放输出-10V, data为0xFFFF/2时输出运放输出0V,data为0xFFFF时输出运放输出10V //temp=(data-0xFFFF/2)/(0xFFFF/2)*2.5*1000*opa printf("data:%d->%0.3fV\n",data,temp/1000); } if(KEY2_StateRead()==KEY_DOWN) { if(data<1000) data=1000; data -=1000;
开关电源具有体积小、效率高、重量轻、噪声低等优点,其应用越来越广泛。我们在设计蓄电池充电器时,就采用开关电源作为主电路,其中开关器件采用第三代IGBT,其主要优点是耐压高,驱动功率小,开关频率高,导通电阻小。 目前,数模转换器从接口上可分为两大类:并行接口数模转换器和串行接口数模转换器。并行接口数模转换器的引脚多,体积大,占用单片机的口线多;而串行数模转换器的体积小,占用单片机的口线少。 电源设计人员经常面临种种互相对立的要求。一方面要缩小体积、降低成本,另一方面又要提供更多功能并提高输出功率。受原理上的限制,模拟电源本身的功能有限,而模拟电源控制器的设计更是越来越复杂。由于这一原因,有些设计人员转向了纯数字电源设计。然而,对于许多设计人员来说,如此快速地转向不熟悉的领域并不容易。比较可行的一种折衷方法是采用传统模拟电源,但增加数字单片机做为前端。 这种设计的优点在于电源本身的控制仍然使用模拟技术来实现。因此电源设计人员不需要从头重新开始全数字设计就可以为现有设计增加新的功能。采用这种方法,设计中仍然使用熟悉的误差放大器、电流检测以及电压检测电路。当然,尽管有些设计单元(如补偿网络)仍然采用分立器件实现,但其余部分则由单片机来控制。 单片机能够带来的功能可分为四类:控制、监测、判断性功能及通信。控制功能与单片机和电源之间的硬件接口有关。有些电源控制器在内部生成控制信号(如参考电压)。这样的控制器为单片机提供的外部连接点很少。 目前,单片机在许多电源设计中的作用主要是监测。许多单片机都有片上模数转换器(ADC)和模拟比较器。因此,单片机在监测输入电压、输入电流、输出电压输出电压和温度等信号方面是理想之选。 单片机能够监测范围如此广泛的信号,就可以完成更多功能,如智能故障检测。单片机的多功能源于其可编程能力,可以方便地进行定制来满足设计要求。这样,对于故障情况就可以分类进行处理。短暂的过流以及其他非关键故障可能只需要设置一个标志就可以了。而过热这样的故障则可能需要关闭电源,直到故障排除。需要重新启动电源的故障也可以进行更严格的控制。在某个时间段内如果有太多的故障,单片机就可以永久关断电源。 由于采用接口简单的模拟数字转换器TLC5615,使得开关电源的硬件电路大为简化,线路板面积缩小,成本降低。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值