利用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);
}
}
}
一周热门 更多>