Sunday, 26 May 2013

Generating sine using DAC and DMA

Generating sine using DAC and DMA

My platform is STM32F4 Discovery board with STM32F407VG.
I'm trying to generate sine wave using DAC and DMA and then measure it with ADC.
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE); //clock for DMA
DAC_Channel2Config(); 
TIM6_Config();
USART2_Config();
DAC_DeInit();
DAC_Ch2SineWaveConfig();
ADC3_CH12_DMA_Config();
ADC_SoftwareStartConv(ADC3);
while(1)
{
    if(enableBlink)
    {
        //send values to UART to check if correct wave generated
        for(i = 0; i < 300; ++i)
        {
            ADC3ConvertedVoltage = ADC3ConvertedValue * 3300/0xFFF;
            sprintf(str,"%u",ADC3ConvertedVoltage);
            USART2_SendText(str);
          USART2_SendText(";");
        }
      enableBlink = 0;
    }
}
Functions:
void DAC_Channel2Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; //DAC channel 2
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, & GPIO_InitStruct);
}
void TIM6_Config(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
    TIM_TimeBaseStructure.TIM_Prescaler = 0;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);

    TIM_SelectOutputTrigger(TIM6,TIM_TRGOSource_Update);
    TIM_Cmd(TIM6,ENABLE);
}
void DAC_Ch2TriangleWaveConfig(void)
{
    DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
        DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_Triangle;
        DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_1023;    
        DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
        DAC_Init(DAC_Channel_2, &DAC_InitStructure);

        /* Enable DAC Channel2 */
        DAC_Cmd(DAC_Channel_2, ENABLE);
        /* Set DAC channel2 DHR12RD register */
        DAC_SetChannel2Data(DAC_Align_12b_R, 0x100);
}
void DAC_Ch2SineWaveConfig(void)
{
        DMA_InitTypeDef DMA_InitStructure;

        /* DAC channel2 Configuration */
        DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
        DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
        DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
        DAC_Init(DAC_Channel_2, &DAC_InitStructure);

        /* DMA1_Stream5 channel 7 configuration **************************************/
        DMA_DeInit(DMA1_Stream5);
        DMA_InitStructure.DMA_Channel = DMA_Channel_7; 
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R2_ADDRESS;
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&Sine12bit;
        DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
        DMA_InitStructure.DMA_BufferSize = 32;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralDataSiz

No comments:

Post a Comment