STM32F103ZET6有2 个 DAC 转换器:每个转换器对应 1 个输出通道
对应的IO口如下:
DAC_OUT1—PA4
DAC_OUT2—PA5
目的:DAC通道2可以输出3.3以下的任意电压,同时通过ADC1通道8采集到,打印到串口。
硬件连接:
由于ADC和DAC都是STM32F103ZET6的内部资源,所以只需要一根杜邦线将ADC1 的通道8即 PB0和DAC2的PA5连接起来即可。
STM32CUBEMX配置:
省略配置时钟和仿真口,直接设置IO,配置如下图。
|
|
因为用到了串口打印,所以需要配置串口,USART1的PA9和PA10
|
|
|
|
代码编写:
1.因为用到串口打印,加入头文件"stdio.h"
+宏定义led灯亮灭状态+变量
/* USER CODE BEGIN 1 */
#include "stdio.h"
#define LED0_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET)//LED0点亮
#define LED0_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET)//LED0熄灭
uint16_t adc_value=0,adc_volt=0;
uint8_t str_buff[64];
/* USER CODE END 1 */
/* USER CODE END Includes */
2.定义串口发送函数+ADC采样函数
/* USER CODE BEGIN 0 */
void URE_Send_Info()
{
sprintf((char*)str_buff,"采样值:%d,电压值:%d.%d%dV\r\n",adc_value,adc_volt/100,(adc_volt%100)/10,adc_volt%10);
HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),10000);
}
void adc_get_value()
{
HAL_ADC_Start(&hadc1); //启动ADC单次转换
LED0_ON();
if(HAL_ADC_PollForConversion(&hadc1,10)==HAL_OK)
{
adc_value=HAL_ADC_GetValue(&hadc1);
adc_volt=adc_value*330/4096;
}
URE_Send_Info();
LED0_OFF();
HAL_ADC_Stop(&hadc1);
}
/* USER CODE END 0 */
3.主函数中的while(1)中加入ad采集函数
while (1)
{
/* USER CODE END WHILE */
adc_get_value();
HAL_Delay(500);
/* USER CODE BEGIN 3 */
}
4.主函数中设置DAC转换电压的大小+开启DAC转换
改变后面的1000的数字大小,即可以改变输出的电压大小。最大不超过3.3V。
/* USER CODE BEGIN 2 */
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_2, DAC_ALIGN_12B_R,1000); // 设置DAC的大小
HAL_DAC_Start(&hdac, DAC_CHANNEL_2);//开启DAC转换
/* USER CODE END 2 */