程序实现功能:
1、上电后,输出正弦波;
2、触摸按键1调整正玄波频率。
目录
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框图
根据框图 我们看到,数模转换由模拟电压提供,参考电压VREF 可以是3.3v 我们根据公式:DAC输出 = VREF x (DOR / 4095)。 设置DOR的值 得到不同的DAC输出。根据参考电压,设置不同采样次数可以得到类似正弦波,如下图所示:
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参数配置
4.2标准文件架构
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);
}
}