一、普通方式输出正弦波
1.1 工程配置
选择DAC通道1,不使用触发方式,不使用输出缓冲,查看输出引脚。
1.2 编写代码
定义一个数组用于存储DAC值,使用sin生成正弦波数据,开启DAC输出,在循环中将数据输出。
#include <math>//使用数学库
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_DAC_Init();
/* USER CODE BEGIN 2 */
uint16_t DAC_Buff[100];//用于存储要输出的DAC值
//生成正弦波数据
for(uint8_t i=0;i<100;i++)
{
DAC_Buff[i]=2048*(sin(i*3.1415926/50)+1);
}
//DAC输出
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
for(uint8_t i=0;i<100;i++)
{
//12位右对齐
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,DAC_Buff[i]);
}
}
/* USER CODE END 3 */
}
1.3 输出波形
通过示波器可以看到PA4引脚输出的波形。
二、定时器触发方式输出正弦波
2.1 工程配置
触发方式选择定时器触发事件,定时对DAC操作,
添加DAC1的DMA,选择循环模式,循环输出DAC值。
开启定时器6,假设要输出100HZ(100ms)的正弦波,从上节普通方式输出的代码中可知,一个正弦波周期分成100份,就是100个数据,10ms操作1个数据,完成一个周期就需要100ms,所以定时器分频系数设置为83,即1us计数一次,重装载值设置100-1,定时器就能100us触发一个更新事件,对DAC进行操作。
2.2 编写代码
同样用代码生成正弦波数据,开启DAC-DMA,开启定时器6,即可输出100HZ的正弦波。
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_DAC_Init();
MX_TIM6_Init();
/* USER CODE BEGIN 2 */
uint16_t DAC_Buff[100];//用于存储要输出的DAC值
//生成正弦波数据
for(uint8_t i=0;i<100;i++)
{
DAC_Buff[i]=2048*(sin(i*3.1415926/50)+1);
}
//开启DMA
HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,(uint32_t*)DAC_Buff,100,DAC_ALIGN_12B_R);
//开启定时器6
HAL_TIM_Base_Start(&htim6);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
2.3 输出波形
通过示波器可以观察到引脚所输出的波形频率为100Hz,与我们计算的相同。
DAC常用操作都已经实现, 通过类似方法可以输出梯形波、三角波、锯齿波等。