熟悉stm32f103c8t6单片机的DAC功能,制作一个简易函数发生器
时间: 2023-09-06 17:13:39 浏览: 216
STM32F103C8T6 信号捕获
首先,需要了解DAC的基本原理。DAC(Digital to Analog Converter)是一种将数字信号转换为模拟信号的电路。在STM32F103C8T6单片机中,它有两个12位的DAC通道,可以将数字信号转换为模拟电压输出。
以下是一个简单的函数发生器的代码,它可以产生正弦波、方波和三角波信号。
```c
#include "stm32f10x.h"
#define PI 3.1415926
void DAC_Configuration(void);
void DAC_SetValue(uint16_t value);
int main(void)
{
uint16_t sin_wave[256];
uint16_t tri_wave[256];
uint16_t sqr_wave[256];
uint16_t i;
for(i=0; i<256; i++)
{
sin_wave[i] = (uint16_t)(2047*sin(2*PI*i/256) + 2048);
tri_wave[i] = (uint16_t)(i*16);
sqr_wave[i] = (i<128) ? 0 : 4095;
}
DAC_Configuration();
while(1)
{
for(i=0; i<256; i++)
{
DAC_SetValue(sin_wave[i]); // 正弦波
//DAC_SetValue(tri_wave[i]); // 三角波
//DAC_SetValue(sqr_wave[i]); // 方波
for(int j=0; j<1000; j++); // 稍作延时
}
}
}
void DAC_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
DAC_Cmd(DAC_Channel_1, ENABLE);
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
DAC_Init(DAC_Channel_2, &DAC_InitStructure);
DAC_Cmd(DAC_Channel_2, ENABLE);
}
void DAC_SetValue(uint16_t value)
{
DAC_SetChannel1Data(DAC_Align_12b_R, value);
DAC_SetChannel2Data(DAC_Align_12b_R, value);
DAC_SoftwareTriggerCmd(DAC_Channel_1, ENABLE);
DAC_SoftwareTriggerCmd(DAC_Channel_2, ENABLE);
}
```
在这个代码中,我们首先定义了三个数组,分别用于存储正弦波、三角波和方波的波形数据。然后我们调用了`DAC_Configuration`函数,用于初始化DAC通道1和通道2。最后我们在主函数中使用一个无限循环,并在循环中逐个输出波形数据。
在`DAC_Configuration`函数中,我们首先开启了GPIOA和DAC的时钟,并设置了PA4和PA5为模拟输入。接着我们使用`DAC_Init`函数初始化了DAC通道1和通道2,并开启了输出缓存。最后我们调用了`DAC_Cmd`函数,使能了DAC通道1和通道2。
在`DAC_SetValue`函数中,我们使用`DAC_SetChannel1Data`和`DAC_SetChannel2Data`函数分别输出了波形数据,并使用`DAC_SoftwareTriggerCmd`函数触发了DAC的输出。由于我们使用了两个DAC通道,所以需要分别输出波形数据。
需要注意的是,由于DAC的输出电压范围是0V到3.3V,所以我们需要将波形数据缩放到0到4095之间。在这个例子中,我们使用了2048作为正弦波的偏置电压,这样正弦波就可以在0V到3.3V之间变化。对于三角波和方波,我们直接将波形数据缩放到0到4095之间。
最后,我们可以根据需要调整波形的频率和幅度,以生成不同的信号。
阅读全文