DAC:神舟IV实验

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为模拟输入。

STM32F103ZET6DAC通道1是接在PA4上的,所以,我们先要使能PORTA的时钟,然后设置PA4为模拟输入(虽然是输入,但是STM32内部会连接在DAC模拟输出上)。

2)使能DAC1时钟。

同其他外设一样,要想使用,必须先开启相应的时钟。STM32DAC模块时钟是由APB1提供的,所以我们先要在APB1ENR寄存器里面设置DAC模块的时钟使能。

3)设置DAC的工作模式。

该部分设置全部通过DAC_CR设置实现,包括:DAC通道1使能、DAC通道1输出缓存关闭、不使用触发、不使用波形发生器等设置。  

4)设置DAC的输出值。

通过前面3个步骤的设置,DAC就可以开始工作了,我们使用12位右对齐数据格式,所以我们通过设置DHR12R1,就可以在DAC输出引脚(PA4)得到不同的电压值了。

最后,再提醒一下大家,本例程,我们使用的是3.3V的参考电压,即Vref+连接VDDA

 

Dac1_Init
 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的值

 

Set Value
1 DAC_SetChannel1Data(DAC_Align_12b_R, 2000);//设置DAC值

 

Get Value
1 DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值
main
 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值  就可以了

 

原文地址:https://www.cnblogs.com/wwjdwy/p/2965650.html