神舟IV实验:使用DAC模块的通道1来输出模拟电压
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。
- Dac1_Init
- //DAC通道1输出初始化
- //DAC 使用PA4,连接到ADC CH1:PA1接收后输出
- void Dac1_Init(void)
- {
-
- GPIO_InitTypeDef GPIO_InitStructure;
- DAC_InitTypeDef DAC_InitType;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); //使能PORTA通道时钟
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE ); //使能DAC通道时钟
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_SetBits(GPIOA,GPIO_Pin_4) ;//PA.4 输出高
-
- DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用触发功能 TEN1=0
- DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
- DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置
- DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1输出缓存关闭 BOFF1=1
- DAC_Init(DAC_Channel_1,&DAC_InitType); //初始化DAC通道1
- DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC1
-
- DAC_SetChannel1Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值
- }
- //读取ADC1的值
- //DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值
- DAC_SetChannel1Data(DAC_Align_12b_R, 2000);//设置DAC值
- DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值
- main
- Adc_Init(); //ADC初始化 PB1
- Dac1_Init(); //DAC初始化 PA4
- DAC_SetChannel1Data(DAC_Align_12b_R, 3000);//设置DAC值
- while(1)
- {
- adcx=DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值
- temp=(float)adcx*(3.3/4096);
- printf("\r\n PA4 DAC 1CH 当前AD转换结果为:0x%X, 百分比为:%d%%,电压值:%f V.\n\r", adcx, adcx*100/4096, temp);
- Delay_ARMJISHU(10000);
- adcx=Get_Adc_Average(ADC_Channel_9,10);
- // adcx=Get_Adc(ADC_Channel_9);
- temp=(float)adcx*(3.3/4096);
- printf("\r\n PB1 ADC 9CH 当前AD转换结果为:0x%X, 百分比为:%d%%,电压值:%f V.\n\r", adcx, adcx*100/4096, temp);
- Delay_ARMJISHU(1000000);
- }
很好的东西!学到了。
不错啊,但是没有输出正弦波的例程
谢谢分享谢谢分享谢谢分享
谢谢分享谢谢分享 谢谢分享
谢谢分享谢谢分享 谢谢分享
谢谢分享 谢谢分享谢谢分享谢谢分享
谢谢分享 谢谢分享 谢 谢
谢谢分享 谢谢分享 谢 谢
谢谢分享 谢谢分享 分 分
谢谢分享 谢谢分享 享 享
谢谢分享 谢谢分享 谢 谢
谢谢分享 谢谢分享 谢 谢
谢 谢谢分享 谢谢分享 分 分
谢谢 谢谢分享 谢谢分享 享 享
谢谢分 谢谢分享 谢谢分享 谢 谢
谢谢分 谢谢分享 谢 谢
谢谢分谢谢分享 谢 谢
谢谢谢谢 分 分
谢谢 享 享
支持一下,小编大作