打印
[STM32F3]

STM32F373 DAC生成正弦波的问题

[复制链接]
3883|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yangwc|  楼主 | 2014-4-30 17:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用STM32F373生成正弦波时发现这样一个奇怪的问题:需要将PA8口或PB1口设置为复用功能时才能够输出正弦波。
      部分代码如下:

unsigned int sin_amp[100];   

void Clock_Configuration(void)
{
         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC   \
                             | RCC_AHBPeriph_GPIOD |RCC_AHBPeriph_GPIOE | RCC_AHBPeriph_GPIOF , ENABLE);
        
         /* TIM3 clock enable */
         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        
         /* Enable DAC clock */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC1, ENABLE);
}



void GPIO_Configuration(void)
{
         GPIO_InitTypeDef GPIO_InitStruct;
        
         /* Configure PA.04 (DAC1_OUT1) in analog mode -------------------------*/
           GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AN;
           GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_NOPULL;
           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
           GPIO_Init(GPIOA, &GPIO_InitStruct);

#if 1

         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
            GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF;     
         GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
           GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
           GPIO_Init(GPIOA, &GPIO_InitStruct);
#endif
}




int main(void)
{
        unsigned char i;
        
        SystemInit();
        Clock_Configuration();
        TIM_INT_Config();
        GPIO_Configuration();

#if 0
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_2);
#endif
        
        DAC_Config();
        TIM3_Configuration();
        
        for(i=0; i<100; i++)
                        sin_amp[i] = (unsigned int)(0x7FF+(float)0x7FF*sin(2*3.1415926*(float)i*0.2/(float)20));
        
        while(1);
}        

void DAC_Config(void)
{
         DAC_InitTypeDef    DAC_InitStruct;   
  
         /* DAC1 channel1 Configuration */
          DAC_InitStruct.DAC_Trigger = DAC_Trigger_T3_TRGO;
          DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_None;
         DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
         DAC_Init(DAC1, DAC_Channel_1, &DAC_InitStruct);
        
         /* Enable DAC1 Channel1 */
         DAC_Cmd(DAC1, DAC_Channel_1, ENABLE);
}



void TIM_INT_Config(void)
{
           NVIC_InitTypeDef NVIC_InitStructure;

           NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
           NVIC_Init(&NVIC_InitStructure);
}




void TIM3_Configuration()
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef        TIM_OCInitStructure;  
        TIM_BDTRInitTypeDef      TIM_BDTRInitStructure;
               
        TIM_DeInit(TIM3);

        TIM_TimeBaseStructure.TIM_Prescaler     = 0x10;      
        TIM_TimeBaseStructure.TIM_Period        = 0x70;                  
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;   
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;   
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);   
        TIM_ARRPreloadConfig(TIM3,ENABLE);                 

        TIM_OCInitStructure.TIM_OCMode       = TIM_OCMode_PWM2;      
                                                              
        TIM_OCInitStructure.TIM_OutputState  = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
        TIM_OCInitStructure.TIM_Pulse        = 0x39;
        TIM_OCInitStructure.TIM_OCPolarity   = TIM_OCPolarity_High;   
        TIM_OCInitStructure.TIM_OCNPolarity  = TIM_OCNPolarity_High;   
        TIM_OCInitStructure.TIM_OCIdleState  = TIM_OCIdleState_Reset;
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;   
        TIM_OC4Init(TIM3, &TIM_OCInitStructure);                  
        TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);      

        TIM_BDTRInitStructure.TIM_OSSRState       = TIM_OSSRState_Enable;      
        TIM_BDTRInitStructure.TIM_OSSIState       = TIM_OSSIState_Enable;      
        TIM_BDTRInitStructure.TIM_LOCKLevel       = TIM_LOCKLevel_3;        
   
        TIM_BDTRInitStructure.TIM_DeadTime        = 4;                        
        TIM_BDTRInitStructure.TIM_Break           = TIM_Break_Enable;            
        TIM_BDTRInitStructure.TIM_BreakPolarity   = TIM_BreakPolarity_High;  
        TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
        TIM_BDTRConfig(TIM3, &TIM_BDTRInitStructure);
                           
        TIM3->SR = 0;

        TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);

        TIM_Cmd(TIM3, ENABLE);

        TIM_CtrlPWMOutputs(TIM3, ENABLE);
        
        TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);
}




void TIM3_IRQHandler(void)
{
         static unsigned char i=0;

           if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
                     {
                          if(i>= 100)
                                 i=0;        
                         DAC_SetChannel1Data(DAC1, DAC_Align_12b_R, sin_amp[i] );
                        i++;
                 }
                 
         TIM3->SR &= 0xfffe;   
}
沙发
mmuuss586| | 2014-4-30 17:53 | 只看该作者
GPIO_Mode_AN   = 0x03  /*!< GPIO Analog Mode */
模拟模式

使用特权

评论回复
板凳
yangwc|  楼主 | 2014-5-1 07:30 | 只看该作者
mmuuss586 发表于 2014-4-30 17:53
GPIO_Mode_AN   = 0x03  /*!< GPIO Analog Mode */
模拟模式

我的设置是PA4口设置为DAC输出(OUT1),如果没有将PA8口或者PB1口设置为复用功能,在PA4口上就没有正弦信号输出。只有将PA8口或PB1口其中的一个设置为复用功能时,PA4口上才有正弦信号输出。当设置PA4口上设置输出三角波或杂波时就没有这个问题(不需要PA8口或PB1口设置成复用)。

使用特权

评论回复
地板
yangwc|  楼主 | 2014-5-4 08:47 | 只看该作者
没人知道是什么原因吗?

使用特权

评论回复
5
airwill| | 2014-5-5 09:57 | 只看该作者
我曾经在 303Discovery 上做正弦波输出试验, 结果怎么都没有波形出来, 但三角波能出来. 难道也是这个原因?
大体看了一下 RM316 手册, 却没有看到这个说明!

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
yangwc + 2 分享了碰到过的问题。
6
yangwc|  楼主 | 2014-5-5 16:31 | 只看该作者
要真的是这样,那ST做的东西真的是说不过去了。

使用特权

评论回复
7
IJK| | 2014-5-5 17:11 | 只看该作者
估计是LZ代码的问题。印象里试过STM32F373的DAC,没有问题的,当时是通过软件直接改改DAC的输出

使用特权

评论回复
8
拿起书本| | 2014-5-7 09:16 | 只看该作者
你的DAC输入是什么格式?还有注意引线不能过长的。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
yangwc + 1 给出了需要注意的问题。
9
yangwc|  楼主 | 2014-5-12 10:47 | 只看该作者
拿起书本 发表于 2014-5-7 09:16
你的DAC输入是什么格式?还有注意引线不能过长的。

如果没有将PA8口或者PB1口设置为复用功能,就没有正弦信号输出,反之则有,这跟引线长度有啥关系?

使用特权

评论回复
10
yangwc|  楼主 | 2014-5-12 10:49 | 只看该作者
拿起书本 发表于 2014-5-7 09:16
你的DAC输入是什么格式?还有注意引线不能过长的。

DAC输入数据格式是12bit,右对齐。跟这个有什么关系?

使用特权

评论回复
11
yangwc|  楼主 | 2014-5-12 15:30 | 只看该作者
airwill 发表于 2014-5-5 09:57
我曾经在 303Discovery 上做正弦波输出试验, 结果怎么都没有波形出来, 但三角波能出来. 难道也是这个原因?
...

对照了STM32F3DISCOVERY的Example后发现:如果设置了LFSR(linear feedback shift register)就有正弦信号输出,哪怕是设置为0(DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;)
并且只要设置了这个寄存器,无论设置的值是什么,都有正弦信号输出,且信号幅度都一样。
真是奇葩,这个寄存器本来是用来设置杂波或三角波幅度的,怎么跟正弦信号能否输出有关系?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

32

帖子

0

粉丝