OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3443|回复: 1

为什么占空比改不了?永远是50% 很奇怪

[复制链接]

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2021-3-14
在线时间
20 小时
发表于 2022-1-7 14:55:43 | 显示全部楼层 |阅读模式
1金钱
本人用的是原子哥方法 在向上计数方式中 需要相位差180度的两路波,同时要求占空比可调  ! 网上参考了一个博文 把博文中的程序移植下可以用 但是在我的程序中 ch3 ch4的占空比不可调 改变中断中TIM_SetCompare3(TIM1,capture_ch3+ch2p-ch2z );   ch2p-ch2z 的值 只有相位差变了 但是占空比不会改变 哪个大佬知道什么原因!  我的频率是85KHZ  但是ARR是423  ch3频率也是 85khz   根据ch2p=72000000/Fpwm
这个公式所得的 ch2p=847= 423的两倍  这样的话 TIM_SetCompare3(TIM1,capture_ch3+ch2p-ch2z );  得到的CCR大于ARR这样可以吗?  但是我把TIM_SetCompare3(TIM1,capture_ch3+20 )  加上一个20 这种远小于423的数  占空比还是不变 难受啊  是  TIM_SetCompare3(TIM1,capture_ch3+ch2p-ch2z )  如果CCR的值大于ARR就有问题吗?  


#include "motor.h"
#include "delay.h"
#include "led.h"
//#include "usart.h"       

#define   Fsys           72000000ul   //  system freq 72MHz
#define   Fpwm           80000        //  PWM freq  85K
#define   PWM_DUTY       80          //  PWM duty  80%
#define   ccr1           0
#define   ccr2           300
#define   deadtime       0


void ConfigTimer( void )
{
    GPIO_InitTypeDef GPIO_InitSturcture;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );

    //TIM1 ??PWM CH1->PA8  CH2->PA9  CH1N->PB13  CH2N->PB14
    GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11;
    GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOA, &GPIO_InitSturcture );

    GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
    GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOB, &GPIO_InitSturcture );
    //?????
    TIM_TimeBaseInitStructure.TIM_Period = (Fsys/2) / Fpwm;
    TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x00;
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00;
    TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure );
    //CH1
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;                                 // μ±CCR1=CNTê±£¬·-×aOC1REFμÄμçÆ½
    TIM_OCInitStructure.TIM_Pulse = ccr1;                                                                //μ±CCR1=CNTê±£¬CH1êä3öμçÆ½·-×a
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                //êäèë¡¢2¶»ñ¡¢±è½ÏμÄóDD§μçÆ½μļ«DÔÎa¸ß
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;         //¿aÆôOC*êä3öμ½Ïàó|òy½Å
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //»¥21êä3öê1Äü£¬¿aÆôOC*Nêä3öμ½¶Ôó|μÄòy½Å
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;          //Ôú¿ÕÏD×′ì¬ÎaμíμçÆ½
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;  //»¥21í¨μàÔú¿ÕÏD×′ì¬Î»μíμçÆ½
    TIM_OC1Init( TIM1, &TIM_OCInitStructure );
    //CH2
    TIM_OCInitStructure.TIM_Pulse = ccr2;                                                                //μ±CCR2=CNTê±£¬CH2êä3öμçÆ½·-×a
    TIM_OC2Init( TIM1, &TIM_OCInitStructure );
    //ËàÇøéèÖÃ
    TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;         //OSSR:ÔËDDÄ£ê½Ï¡°1رÕ×′쬡±Ñ¡Ôñ
    TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;         //OSSI:¿ÕÏDÄ£ê½Ï¡°1رÕ×′ì¬ Ñ¡Ôñ
    TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;                         //??? ?,???1
    TIM_BDTRInitStructure.TIM_DeadTime = deadtime;                                        //ËàÇøÑóê±ê±¼ä
    TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;                        //½ûÖ1é23μêäèë
    TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;                 //é23μêäè뼫DÔ
    TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; //×Ô¶ˉêä3öê1Äü
    TIM_BDTRConfig( TIM1, &TIM_BDTRInitStructure );
               
                /* CH3 */
                TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
                TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
                TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable;
                TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
                TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
                TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
                TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
                TIM_OCInitStructure.TIM_Pulse = 0;
                TIM_OC3Init(TIM1,&TIM_OCInitStructure);
    /* CH4 */
                TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
                TIM_OCInitStructure.TIM_Pulse =((Fsys/2) / Fpwm) ;
                TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  //μ±CH3óëCH4μÄÏàλ2î′óóúμèóú180¶èê±,êä3ö¼«DÔòaéèÖÃÎaÏà·′
                TIM_OC4Init(TIM1,&TIM_OCInitStructure);
               
    TIM_CtrlPWMOutputs( TIM1, ENABLE );
    TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Enable );      //ÔêDí¶¨ê±Æ÷1¤×÷ê±ÏòARRμÄ»o3åÆ÷D′èëDÂÖ죬챶¨ê±Æ÷í¨1y
    TIM_OC2PreloadConfig( TIM1, TIM_OCPreload_Enable );      //èí¼t½øDD¸üDÂCCRxμÄÖμ¿ØÖÆ2¨DÎê±£¬ÏÂò»′θüDÂê¼tê±±»¸üDÂ
                TIM_OC3PreloadConfig( TIM1, TIM_OCPreload_Disable );     //2»ÔêDí¶¨ê±Æ÷1¤×÷ê±ÏòARRμÄ»o3åÆ÷D′èëDÂÖ죬챶¨ê±Æ÷í¨1y
                TIM_OC4PreloadConfig( TIM1, TIM_OCPreload_Disable );     //èí¼t½øDD¸üDÂCCRxμÄÖμ¿ØÖÆ2¨DÎê±£¬á¢¼′éúD§
    TIM_ARRPreloadConfig( TIM1, ENABLE );
//                TIM_ClearFlag(TIM1, TIM_FLAG_CC3)  ;                     //ÇåÖD¶Ï£¬òÔÃaò»ÆôóÃÖD¶Ïᢼ′2úéúÖD¶Ï
//                TIM_ClearFlag(TIM1, TIM_FLAG_CC4)  ;                     //ÇåÖD¶Ï£¬òÔÃaò»ÆôóÃÖD¶Ïᢼ′2úéúÖD¶Ï
                TIM_ITConfig( TIM1,TIM_IT_CC3 |TIM_IT_CC4,ENABLE);      //ÔêDí CH3¡¢CH4í¨μàμÄêä3ö±è½ÏÖD¶Ï
    TIM_Cmd( TIM1, ENABLE );
               
                    /*  ÖD¶ÏéèÖÃ */
    /* Configure one bit for preemption priority */
                NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; //TIM12¶»ñ±è½ÏÖD¶Ï
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //ÏèÕ¼óÅÏè¼¶2¼¶
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //′óóÅÏè¼¶0¼¶
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //
                NVIC_Init(&NVIC_InitStructure);                 //3õê¼»ˉNVIC
}



void TIM1_CC_IRQHandler(void)
{
         u16 ch2p=72000000/Fpwm ;
   u16 ch2z=ch2p*PWM_DUTY/100;
         u16 capture_ch3=0;
   u16 capture_ch4=0;
        static u8 ch3flag=0;
        static u8 ch4flag=0;
        LED0=0;
        if (TIM_GetITStatus(TIM1, TIM_IT_CC3) )    // CH3′¥·¢êä3ö±è½ÏÖD¶Ï
        {
                capture_ch3= TIM_GetCapture3(TIM1);
                if(ch3flag)
                {
                        TIM_SetCompare3(TIM1,capture_ch3+ch2p-ch2z );
                }
                else
                {
                        TIM_SetCompare3(TIM1, capture_ch3+ch2z );
                }
                ch3flag^=1;  //2»¶Ïè¡·′
        }
//        if (TIM_GetITStatus(TIM1, TIM_IT_CC4) != RESET)    // CH4′¥·¢êä3ö±è½ÏÖD¶Ï
//        {
//                capture_ch4= TIM_GetCapture4(TIM1);
//                if(ch4flag)
//                {
//                        TIM_SetCompare4(TIM1,  capture_ch4+ch2p-ch2z );
//                }
//                else
//                {
//            TIM_SetCompare4(TIM1, capture_ch4+ch2z );
//                }
//                ch4flag^=1;  //2»¶Ïè¡·′
//        }
        TIM_ClearITPendingBit(TIM1, TIM_IT_CC3|TIM_IT_CC4);  //Çå3yCH3¡¢CH4μÄêä3ö±è½ÏÖD¶Ï±ê־λ
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3625
金钱
3625
注册时间
2019-8-14
在线时间
1054 小时
发表于 2022-1-7 17:20:38 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 19:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表