初级会员

- 积分
- 173
- 金钱
- 173
- 注册时间
- 2020-6-7
- 在线时间
- 67 小时
|
5金钱
想实现频率可调的正弦波,就想着用TIM去控制,计时溢出就出发DMA,给DAC数据,然而始终有问题,不能采集到正弦波 希望大家看看哪里错误了
程序如下:
TiM 配置:
void MX_TIM6_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim6.Instance = TIM6;
htim6.Init.Prescaler = 319;
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
htim6.Init.Period = 9;
htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
}
DAC的配置:
sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;
sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* DAC1 DMA Init */
/* DAC_CH1 Init */
hdma_dac_ch1.Instance = DMA1_Channel3;
hdma_dac_ch1.Init.Request = DMA_REQUEST_6;
hdma_dac_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_dac_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_dac_ch1.Init.MemInc = DMA_MINC_ENABLE;
hdma_dac_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_dac_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_dac_ch1.Init.Mode = DMA_CIRCULAR;
hdma_dac_ch1.Init.Priority = DMA_PRIORITY_LOW;
主程序:
初始化
生成正弦波数据,然后读
void get_sineval(float Amp) //生成正弦波函数
{
float x;
if(Amp>Vref/2)
{
Amp=Vref/2;
}
for(int i=0;i<N;i++)
{
x=(Amp*sin(2*PI*i/N));
x=Vref/2+x;
sine_val[i]=x*MAXDAC/Vref;
}
}
get_sineval(1); // 读
HAL_TIM_Base_Start(&htim6);
HAL_DAC_Start_DMA(&hdac1,DAC_CHANNEL_2,(uint32_t *)Sine12bit,100,DAC_ALIGN_12B_R);
|
|