STM32实战项目-DAC正弦波

程序实现功能:

1、上电后,输出正弦波;

2、触摸按键1调整正玄波频率。


 

目录

 1.硬件电路

 2.技术讲解

2.1DAC介绍

2.2特性

2.3框图 

 3.HAL库函数

4.软件编程

 4.1参数配置

 4.2标准文件架构

 4.3运行函数

4.4DAC函数

 4.5DAC实现函数

 4.6按键控制频率



 1.硬件电路

这个部分比较简单,主要是对电压 进行周期采样,最后通过示波器显示出类似正弦波。硬件电路如下所示:

 2.技术讲解

2.1DAC介绍

数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。 DAC可以配置为8位
或12位模式
,也可以与DMA控制器配合使用。 DAC工作在12位模式时,数据可以设置成左对齐
或右对齐
。 DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下, 2个通道
可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。 DAC可以通过引脚输
入参考电压VREF+以获得更精确的转换结果。

2.2特性

● 2个DAC转换器:每个转换器对应1个输出通道
● 8位或者12位单调输出
● 12位模式下数据左对齐或者右对齐
● 同步更新功能
● 噪声波形生成
● 三角波形生成
● 双DAC通道同时或者分别转换
● 每个通道都有DMA功能
● 外部触发转换
● 输入参考电压VREF+
数字输入经过DAC被线性地转换为模拟电压输出,其范围为0到VREF+。
任一DAC通道引脚上的输出电压满足下面的关系:
DAC输出 = VREF x (DOR / 4095)。
 

2.3框图 

STM32实战项目-DAC正弦波_第1张图片

 根据框图 我们看到,数模转换由模拟电压提供,参考电压VREF 可以是3.3v 我们根据公式:DAC输出 = VREF x (DOR / 4095)。 设置DOR的值 得到不同的DAC输出。根据参考电压,设置不同采样次数可以得到类似正弦波,如下图所示:

STM32实战项目-DAC正弦波_第2张图片

 3.HAL库函数

/* IO operation functions *****************************************************/
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel);
HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef *hdac, uint32_t Channel);
HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t *pData, uint32_t Length,
                                    uint32_t Alignment);
HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel);

void HAL_DAC_IRQHandler(DAC_HandleTypeDef *hdac);

HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);

void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef *hdac);
void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef *hdac);
void HAL_DAC_ErrorCallbackCh1(DAC_HandleTypeDef *hdac);
void HAL_DAC_DMAUnderrunCallbackCh1(DAC_HandleTypeDef *hdac);

 根据库函数的名字,也很容易辨识出不同函数的作用,以及对应的形参。

4.软件编程

 4.1参数配置

STM32实战项目-DAC正弦波_第3张图片 

 4.2标准文件架构

STM32实战项目-DAC正弦波_第4张图片

 4.3运行函数

调用dac显示函数 

static void Run()
{
	DAC_Apply.Output_Sine_Wave();
}

4.4DAC函数

对相关函数,变量进行封装 

//结构体封装
typedef struct
{
	uint8_t Cycle;
	
	void (*DAC_Start)(void);
	void (*Output_Sine_Wave)(void);	
} DAC_Apply_t;

/* extern variables-----------------------------------------------------------*/
extern DAC_Apply_t  DAC_Apply;

 4.5DAC实现函数

DOR值得选取:

const uint16_t CH_value[32] = 
{
	2448,2832,3186,3496,3751,3940,4057,4095,4057,3940,
	3751,3496,3186,2832,2448,2048,1648,1264,910,600,345,
	156,39,0,39,156,345,600,910,1264,1648,2048
};

 函数实现:

static void Output_Sine_Wave()
{
	uint8_t  i = 0,Cycle = 0;
	
	for(i=0;i<32;i++)
	{
		HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,CH_value[i]);
		
		//延时
		Cycle = DAC_Apply.Cycle;
		while(Cycle--);
	}
}

 4.6按键控制频率

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == KEY1_Pin)
	{
		//调整正弦波周期
		DAC_Apply.Cycle += 5;
		
		if(DAC_Apply.Cycle >= 101)
			DAC_Apply.Cycle = 1;
		
		LED.LED_Flip(LED2);	
	}
}

 

你可能感兴趣的:(stm32,单片机,嵌入式硬件)