DAC相对比较简单,看寄存器手册,内容不是太多。
同样方式DAC 给 ADC 串口输出。目前一直没有用LCD,木有移植呢
DAC:PA4 ADC:PB1 :
PA4 DAC 1CH 当前AD转换结果为:0xBB8, 百分比为:73%,电压值:2.416992 V.
PB1 ADC 9CH 当前AD转换结果为:0xBB5, 百分比为:73%,电压值:2.414575 V.
正点原子:http://openedv.com/posts/list/12952.htm
通过以上介绍,我们了解了STM32实现DAC输出的相关设置,本章我们将使用DAC模块的通道1来输出模拟电压,其详细设置步骤如下:
1)开启PA口时钟,设置PA4为模拟输入。
STM32F103ZET6的DAC通道1是接在PA4上的,所以,我们先要使能PORTA的时钟,然后设置PA4为模拟输入(虽然是输入,但是STM32内部会连接在DAC模拟输出上)。
2)使能DAC1时钟。
同其他外设一样,要想使用,必须先开启相应的时钟。STM32的DAC模块时钟是由APB1提供的,所以我们先要在APB1ENR寄存器里面设置DAC模块的时钟使能。
3)设置DAC的工作模式。
该部分设置全部通过DAC_CR设置实现,包括:DAC通道1使能、DAC通道1输出缓存关闭、不使用触发、不使用波形发生器等设置。
4)设置DAC的输出值。
通过前面3个步骤的设置,DAC就可以开始工作了,我们使用12位右对齐数据格式,所以我们通过设置DHR12R1,就可以在DAC输出引脚(PA4)得到不同的电压值了。
最后,再提醒一下大家,本例程,我们使用的是3.3V的参考电压,即Vref+连接VDDA。
1 //DAC通道1输出初始化 2 //DAC 使用PA4,连接到ADC CH1:PA1接收后输出 3 void Dac1_Init(void) 4 { 5 6 GPIO_InitTypeDef GPIO_InitStructure; 7 DAC_InitTypeDef DAC_InitType; 8 9 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); //使能PORTA通道时钟 10 RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE ); //使能DAC通道时钟 11 12 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 端口配置 13 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入 14 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 15 GPIO_Init(GPIOA, &GPIO_InitStructure); 16 GPIO_SetBits(GPIOA,GPIO_Pin_4) ;//PA.4 输出高 17 18 DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用触发功能 TEN1=0 19 DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生 20 DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置 21 DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1输出缓存关闭 BOFF1=1 22 DAC_Init(DAC_Channel_1,&DAC_InitType); //初始化DAC通道1 23 24 DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC1 25 26 DAC_SetChannel1Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值 27 28 } 29 30 //读取ADC1的值 31 //DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值
1 DAC_SetChannel1Data(DAC_Align_12b_R, 2000);//设置DAC值
1 DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值
1 Adc_Init(); //ADC初始化 PB1 2 Dac1_Init(); //DAC初始化 PA4 3 4 DAC_SetChannel1Data(DAC_Align_12b_R, 3000);//设置DAC值 5 while(1) 6 { 7 adcx=DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值 8 temp=(float)adcx*(3.3/4096); 9 printf("\r\n PA4 DAC 1CH 当前AD转换结果为:0x%X, 百分比为:%d%%,电压值:%f V.\n\r", adcx, adcx*100/4096, temp); 10 Delay_ARMJISHU(10000); 11 adcx=Get_Adc_Average(ADC_Channel_9,10); 12 // adcx=Get_Adc(ADC_Channel_9); 13 temp=(float)adcx*(3.3/4096); 14 printf("\r\n PB1 ADC 9CH 当前AD转换结果为:0x%X, 百分比为:%d%%,电压值:%f V.\n\r", adcx, adcx*100/4096, temp); 15 Delay_ARMJISHU(1000000); 16 }
没有加入调节DAC大小的方法,只要调用 DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值 就可以了