关于f407输出两路 pwm dac 的疑惑

2019-07-20 16:12发布

本帖最后由 爱奔跑的IT 于 2017-3-8 13:34 编辑

我之前做的输出一路pwm dac输出模拟电压已经成功。但是现在发现同样的方法再输出一路模拟电压却不能成功。代码如下,望有识之士能不吝赐教。谢谢。
以下是pwmdac.c文件。成功的是TIM9同样的方法用在TIM14不成功,换TIM12也是这样。
void TIM9_CH2_PWM_Init(u16 arr,u16 psc)
{        
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
   
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9,ENABLE);      //TIM9ʱÖÓʹÄÜ   
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //ʹÄ&#220ORTAʱÖÓ   
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //GPIOA3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;    //ËÙ¶È100MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­
    GPIO_Init(GPIOA,&GPIO_InitStructure); //³õʼ»&#175A3

    GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_TIM9); //GPIOA3¸´ÓÃλ¶¨Ê±Æ÷9 AF3

    TIM_TimeBaseStructure.TIM_Prescaler=psc;  //¶¨Ê±Æ÷·ÖƵ
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ
    TIM_TimeBaseStructure.TIM_Period=arr;   //×Ô¶¯ÖØ×°ÔØÖµ
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseInit(TIM9,&TIM_TimeBaseStructure);//³õʼ»¯¶¨Ê±Æ÷9

    //³õʼ»¯TIM9 Channel1 PWMģʽ     
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß
    TIM_OCInitStructure.TIM_Pulse=0;
    TIM_OC2Init(TIM9, &TIM_OCInitStructure);  //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM9 OC2

    TIM_OC2PreloadConfig(TIM9, TIM_OCPreload_Enable);  //ʹÄÜTIM9ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷

  TIM_ARRPreloadConfig(TIM9,ENABLE);//ARPEʹÄÜ
   
    TIM_Cmd(TIM9, ENABLE);  //ʹÄÜTIM9
}
void TIM14_CH2_PWM_Init(u16 arr,u16 psc)
{        
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
   
   
    RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);      //TIM9ʱÖÓʹÄÜ   
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); //ʹÄ&#220ORTAʱÖÓ   
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //GPIOA3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;    //ËÙ¶È100MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­
    GPIO_Init(GPIOG,&GPIO_InitStructure); //³õʼ»&#175A3

    GPIO_PinAFConfig(GPIOG,GPIO_PinSource4,GPIO_AF_TIM14); //GPIOA3¸´ÓÃλ¶¨Ê±Æ÷9 AF3

    TIM_TimeBaseStructure.TIM_Prescaler=psc;  //¶¨Ê±Æ÷·ÖƵ
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ
    TIM_TimeBaseStructure.TIM_Period=arr;   //×Ô¶¯ÖØ×°ÔØÖµ
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//³õʼ»¯¶¨Ê±Æ÷9

    //³õʼ»¯TIM14 Channel1 PWMģʽ     
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß
    TIM_OCInitStructure.TIM_Pulse=0;
    TIM_OC2Init(TIM14, &TIM_OCInitStructure);  //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM9 OC2

    TIM_OC2PreloadConfig(TIM14, TIM_OCPreload_Enable);  //ʹÄÜTIM9ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷

  TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPEʹÄÜ
   
    TIM_Cmd(TIM14, ENABLE);  //ʹÄÜTIM9
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
正点原子
1楼-- · 2019-07-21 15:17
爱奔跑的IT 发表于 2017-3-9 11:44
原子哥。另外请教一个问题,我昨晚用dac双通道输出两路模拟电压0-3V,测试一遍是正常的,
今天上电之后 ...

你下载我们例程,测试下看看正常么?
爱奔跑的IT
2楼-- · 2019-07-21 21:08
本帖最后由 爱奔跑的IT 于 2017-3-14 11:10 编辑
正点原子 发表于 2017-3-13 22:02
你下载我们例程,测试下看看正常么?

例程用的按键,我是直接串口发送数据,但是只要连续发送数据的时间间隔短到一定程度输出的dac值就会响应不过来,或者直接就是接近0的值,但是数据收发都是正常的就是dac的值不正常。这种情况可能会是拿些原因导致的呢,部分代码我会粘贴上,麻烦原子哥给看看,一直找不出原因,,,
数据分析的代码如下:
[mw_shl_code=c,true]while(1)
                        {
                                if(timex)timex--;
                                if(timex==1)LCD_Fill(30+54,100,239,112,WHITE);
                                t++;
                                delay_ms(10);
                                if(USART3_RX_STA&0X8000)                //接收到一次数据
                                {
                                        rlen=USART3_RX_STA&0X7FFF;        //得到接收数据的长度
                                        USART3_RX_BUF[rlen]=0;                //添加结束符
                                        strncpy(USART3_SEND_BUF_DATE,&USART3_RX_BUF[12],5);//得到其他控制符
                                        date= atoi(USART3_SEND_BUF_DATE);
                                        strncpy(USART3_SEND_BUF_LEFT,&USART3_RX_BUF[17],4);//得到左电机速度值
                                        left = atoi(USART3_SEND_BUF_LEFT);
                                        strncpy(USART3_SEND_BUF_RIGHT,&USART3_RX_BUF[21],4);//得到右电机速度值
                                        right= atoi(USART3_SEND_BUF_RIGHT);
                                        if((date/10000)==1)        //µç»úÆô¶¯
                                        {
                                                        GPIO_SetBits(GPIOG,GPIO_Pin_12);   //左电机使能
                                                if(((date/1000)%10)==1)//左电机正转
                                                {
                                                        GPIO_SetBits(GPIOG,GPIO_Pin_11);
                                                        if(date/100%10==1)
                                                        {
                                                                GPIO_SetBits(GPIOG,GPIO_Pin_2);//右电机正转
                                                        }
                                                        else
                                                        {
                                                                GPIO_ResetBits(GPIOG,GPIO_Pin_2);//右电机反转
                                                        }
                                                }
                                                else                                                                         //左电机反转
                                                {
                                                        GPIO_ResetBits(GPIOG,GPIO_Pin_11);
                                                        if(date/100%10==1)
                                                        {
                                                                GPIO_SetBits(GPIOG,GPIO_Pin_2);////右电机正转
                                                        }
                                                        else //if(date/100%10==0)
                                                        {
                                                                GPIO_ResetBits(GPIOG,GPIO_Pin_2);//右电机反转
                                                        }
                                                }               
                                                if(USART3_RX_STA&0X8000)
                                                {
                                                        Dac1_Set_Vol(left);                //左电机dac输出
                                                        left=0;               
                                                        Dac2_Set_Vol(right);        //右电机dac输出
                                                        right=0;               
                                                }                                                               
                                        }
                                        printf("%d ",&USART3_RX_BUF[12]);        //发送到串口
                                       
                                        sprintf((char*)p,"接收了%d字节,内容如下",rlen-12);//接收到的数据长度
                                        LCD_Fill(30+54,115,239,130,WHITE);
                                        POINT_COLOR=BRED;
                                        Show_Str(30+54,115,156,12,p,12,0);                         //显示接收的数据长度
                                        POINT_COLOR=BLUE;
                                        LCD_Fill(30,130,239,319,WHITE);
                                        Show_Str(30,130,180,190,&USART3_RX_BUF[12],12,0);//显示接收的数据                                                                       
                                        USART3_RX_STA=0;
                                        if(constate!='+')t=1000;                //状态还未连接,立即更新
                                        else t=0;                   //状态已连接                                       
                                }
                               
                                if(t==3000)//30s检查一次连接是否存在
                                {
                                        LCD_Fill(30+54,125,239,130,WHITE);
                                        LCD_Fill(60,80,120,92,WHITE);
                                        constate=atk_8266_consta_check();//得到连接状态
                                        if(constate=='+')Show_Str(30+30,80,200,12,"连接成功",12,0);  //连接状态
                                        else Show_Str(30+30,80,200,12,"连接失败",12,0);          
                                        t=0;
                                }
                                if((t%20)==0)LED0=!LED0;
                                atk_8266_at_response(1);
                }[/mw_shl_code]

一周热门 更多>