关于PWM与输出的电压、电流之间的关系

2019-07-21 02:26发布

利用STM32发出PWM之后,通过功放模块后接到喇叭上,测试加在喇叭上的交流电流和交流电压的大小。
然而为什么在一定的频率之下,当占空比小于50%之前,电流电压按着占空比的增加而增加,当超过50%的时候,电流电压就按着占空比的增加而减少了?
是程序上的问题还是PWM输出就是这样的规律?

以下是我的主函数:
int main(void)
{       
         
        int j=0;
        int timenumber=0;
        int sizenumber=1;
        int frequencynumber=10;
        u8 t=0;          
        u16 arr=(10000-1);         
        float equalnumber=0;
        float count=0;
         
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

        KEY_Init();
        delay_init();            //延时函数初始化          
        LED_Init();                          //初始化与LED连接的硬件接口
        TIM1_PWM_Init(arr,720-1);
        TIM_Cmd(TIM1, DISABLE);//关闭PWM
        OLED_Init();        //初始化OLED

         
        OLED_ShowString(0,0,"Time:",16);  
        OLED_ShowString(0,16, "Frequency:",16);  
        OLED_ShowString(0,32,"Size:  1",16);
        OLED_ShowString(44,0,"   0s",16);  
        OLED_ShowString(80,16, "  10Hz",16);   
        OLED_ShowString(0,48,"Power:",16);
        OLED_ShowString(44,48,"     W",16);
        OLED_Refresh_Gram();//更新显示到OLED         
       
        TIM_CtrlPWMOutputs(TIM1,DISABLE);  //MOE 主输出失能       
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);  //初始化PWM输出端为低电平

    //将装载值分为100份(预处理)
        equalnumber=arr/100;   
        count=equalnumber;
       
           while(1)
        {
                t=KEY_Scan(0);
                switch(t)
                {
                        case KEY0_PRES:  //KEY0按键控制灯变亮
                                 sizenumber+=1;
                                 count=equalnumber+count;
                                 if(sizenumber>100)
                                 {
                                         sizenumber=1;
                                         count=equalnumber;
                                 }
                                 OLED_ShowNum(40,32,sizenumber,3,16);
                                 OLED_Refresh_Gram();
                        break;
                       
                        case KEY1_PRES: //KEY1按键控制灯变频 频率从10HZ到5000HZ
                                 frequencynumber=frequencynumber+10;
                                 if(frequencynumber>5000)
                                 {
                                         frequencynumber=10;
                                         arr=(10000-1);
                                 }
                                 
                                 arr=((100000/frequencynumber)-1);
                                 equalnumber=arr/100;                     //将装载值分为100份
                                 count=equalnumber;
                                 sizenumber=1;
                                 OLED_ShowNum(40,32,sizenumber,3,16);
                                 OLED_ShowNum(80,16,frequencynumber,4,16);
                                 OLED_Refresh_Gram();
                        break;
                       
                        case WKUP_PRES: //WK_UP按键控制灯持续的时间
                                 j+=1;
                                 timenumber+=1;
                                 if(j>3600)
                                 {
                                         j=0;
                                         timenumber=0;
                                 }
                                 OLED_ShowNum(44,0,timenumber,4,16);
                                 OLED_Refresh_Gram();
                        break;
                       
                        case KEY2_PRES: //KEY2按键控制开关
                                 //重新配置arr与psc的参数
                                 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
                                 TIM_TimeBaseStructure.TIM_Prescaler =(720-1); //设置用来作为TIMx时钟频率除数的预分频值  不分频
                                 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
                                 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
                                 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
                                 //开启PWM输出的使能参数
                                 TIM_CtrlPWMOutputs(TIM1,ENABLE);//MOE 主输出使能       
                                 TIM_Cmd(TIM1, ENABLE);//开启PWM
                                 TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
                                 TIM_SetCompare1(TIM1,count);

                                 HOLDINGTIME_Init(j);//进入到选择持续的时间函数中
                       
                                 LED1=!LED1; // 测试是否结束PWM的发生
                                 //关闭PWM的使能参数
                                 TIM_Cmd(TIM1, DISABLE);//关闭PWM
                                 TIM_CtrlPWMOutputs(TIM1,DISABLE);  //MOE 主输出失能       
                                 GPIO_ResetBits(GPIOA,GPIO_Pin_8);  //结束后PWM输出端为低电平
                        //         TIM_ForcedOC1Config(TIM1, TIM_ForcedAction_InActive); 强行致PA.8为低电平,但是只能初始化才能重启PWM
                       
                        //                OLED_ShowNum(44,48,adcx,4,16);  
//                                    OLED_Refresh_Gram();
                       
                        break;
                       
                        default: delay_ms(10);
                }
               
        }

}

0条回答

一周热门 更多>