新手入门
- 积分
- 15
- 金钱
- 15
- 注册时间
- 2016-6-12
- 在线时间
- 1 小时
|
5金钱
本帖最后由 lf9335 于 2024-10-9 15:17 编辑
使用STM32F103VET的DAC输出通道1输出正弦波,采样TIM2触发DAC,使用DMA将数值从内存数组传送到DAC的寄存器。BUF中存有一个周期的正弦波数值(32个数据点)。
遇到以下问题:
(1)产生的波形如下图所示,在波峰处有5个点的电压掉下去了,无论在开发板上还是在自己做的电路上都如此,可以确认不是开发板上PA4上的上拉电阻的原因,因
为自己做的板子上无上拉电阻。
(2)在自己做的板子上一旦使用了DAC的BUF,输出电压就一直为零了,只能不使用BUF。
哪位遇到过类似的问题,如何解决的?望赐教。
代码如下:
/* 波形数据 ---------------------------------------------------------*/
const uint16_t Sine12bit[32] = {
2048, 2460, 2856, 3218, 3532, 3786, 3969, 4072,
4093, 4031, 3887, 3668, 3382, 3042, 2661, 2255,
1841, 1435, 1054, 714, 428, 209, 65, 3,
24, 127, 310, 564, 878, 1240, 1636, 2048
};
uint32_t DAC_Buf[32];
void DAC_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitStructure;
//Enable GPIOA Clock Clock;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
//Enable DAC Clock;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_DAC, ENABLE);
//Init GPIO for DAC_OUT1
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/* 配置DAC 通道1 */
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO; //使用TIM2作为触发源
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; //不使用波形发生器
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //使用DAC输出缓冲
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
/* 使能通道1 由PA4输出 */
DAC_Cmd(DAC_Channel_1, ENABLE);
/* 使能DAC的DMA请求 */
DAC_DMACmd(DAC_Channel_1, ENABLE);
}
/**
* @brief 配置TIM2
* @param 无
* @retval 无
*/
static void DAC_TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* 使能TIM2时钟,TIM2CLK 为72M */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* TIM2基本定时器配置 */
// TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 5; //定时周期 5*0.1ms=0.5ms
TIM_TimeBaseStructure.TIM_Prescaler = 7199; //预分频, 72M / 7200 = 10k
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时钟分频系数
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* 配置TIM2触发源 */
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
/* 使能TIM2 */
TIM_Cmd(TIM2, ENABLE);
}
/**
* @brief 配置DMA
* @param 无
* @retval 无
*/
static void DAC_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
/* 使能DMA2时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
/* 配置DMA2 */
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_Address; //外设数据地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DAC_Buf ; //内存数据地址 DAC_Buf
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //数据传输方向内存至外设
DMA_InitStructure.DMA_BufferSize = 32; //缓存大小为32字节
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设数据地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存数据地址自增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //外设数据以字为单位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //内存数据以字为单位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //高DMA通道优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //非内存至内存模式
DMA_Init(DMA2_Channel3, &DMA_InitStructure);
/* 使能DMA2-14通道 */
DMA_Cmd(DMA2_Channel3, ENABLE);
}
/**
* @brief DAC初始化函数
* @param 无
* @retval 无
*/
void DAC_Mode_Init(void)
{
uint32_t Idx = 0;
DAC_Config();
DAC_TIM_Config();
DAC_DMA_Config();
/* 填充正弦波形数据,双通道右对齐*/
for (Idx = 0; Idx < 32; Idx++)
{
DAC_Buf[Idx] = Sine12bit[Idx];
}
}
|
|