炒冷饭系列-STM32F103之DAC

WK_UP 和 KEY1(也就是上下键)来实现对 DAC 输出的幅值控制。按下 WK_UP 增加,按
KEY1 减小。同时在 LCD 上面显示 DHR12R1 寄存器的值、 DAC 设计输出电压以及 ADC 采集
到的 DAC 输出电压。

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "lsens.h"
#include "adc.h"

void dac_Init(void);
void Dac1_Set_Vol(u16 Vol);

 int main(void)
 {	
	 u16 dacval=0;
	 u16 adcval=0;
	 u8 t=0;
	 u8 key=0;
	 float temp=0;
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 	//串口初始化为115200
 	LED_Init();			     //LED端口初始化
	KEY_Init();
	LCD_Init();
	 
	
	dac_Init(); 
	 myAdcInit();
	LCD_ShowString(60,150,200,16,16,"DAC VAL:");
	LCD_ShowString(60,170,200,16,16,"DAC VOL:0.000V");
	LCD_ShowString(60,190,200,16,16,"ADC VOL:0.000V");
	while(1) 
	{	
		t++;	
		key=KEY_Scan(0);		
		if(key==WKUP_PRES)
		{
			if(dacval<4000)dacval+=200;
			else dacval=0;
			DAC_SetChannel1Data(DAC_Align_12b_R,dacval);//设置输出为0  temp:是寄存器值
		}
		
		if(key==KEY1_PRES)
		{
			if(dacval>200)dacval-=200;
			else dacval=0;
			DAC_SetChannel1Data(DAC_Align_12b_R,dacval);//设置输出为0  temp:是寄存器值
		}
		
		if(t==10||key==KEY1_PRES||key==WKUP_PRES)
		{
			
			adcval=DAC_GetDataOutputValue(DAC_Channel_1);
			LCD_ShowxNum(124,150,adcval,4,16,0); //显示 DAC 寄存器值
			//DACx 输出电压=Vref*(DORx/4095)
			temp=(adcval*(3.3/4095));//DACx 输出电压
			adcval=temp;
			LCD_ShowxNum(124,170,adcval,1,16,0); //显示电压值整数部分
			temp-=adcval;
			temp*=1000;
			LCD_ShowxNum(140,170,temp,3,16,0X80); //显示电压值的小数部分
//			
			adcval=adcArc(ADC_Channel_1,10);//通道1,采样10次
//			LCD_ShowxNum(124,190,adcval,4,16,0);//寄存器的值只有12位,2^12=4096最大值为4位
//			
			temp=(float)adcval*(3.3/4095);//参考电压3.3V,被分成4096份  得到的adc_val 占多少份
			adcval=temp;//含有小数的强转化为整数
			LCD_ShowxNum(124,190,adcval,1,16,0);//显示电压值 整数位
//			
			temp-=adcval;//得到小数部分
			temp*=1000;//得到3位整数,为了显示出来
			LCD_ShowxNum(140,190,temp,3,16,0X80);显示电压值 小数位
			
			t=0;
		}
		
//		LED0=!LED0;
//		delay_ms(250);
	} 
}
 
//按下 WK_UP 增加,按
//KEY1 减小。
void dac_Init(void)
{
	 GPIO_InitTypeDef GPIO_InitStruct;
	DAC_InitTypeDef DAC_InitStruct;
	
	//1、GPIOA、DAC时钟使能 DAC_OUT1->PA4
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
	
	//2、GPIO配置 模拟输入
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	GPIO_SetBits(GPIOA,GPIO_Pin_4) ; //PA.4 输出高
	
	//3、DAC配置
	DAC_InitStruct.DAC_Trigger=DAC_Trigger_None;
	DAC_InitStruct.DAC_WaveGeneration=DAC_WaveGeneration_None;
	DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;
	DAC_InitStruct.DAC_OutputBuffer=DAC_OutputBuffer_Disable;
	DAC_Init(DAC_Channel_1, &DAC_InitStruct);
	
  DAC_Cmd(DAC_Channel_1,ENABLE);	
	DAC_SetChannel1Data(DAC_Align_12b_R,0);//设置输出为0
}

版权声明:本文为chenyouledashen原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。