在论坛问的问题比较多 也还是要贡献一些东西出来
首先我们需要弄清楚两个问题
第一个问题 什么是占空比
占空比是指在周期T时间段里面,高电平持续的时间与整个周期T的比值,称为占空比,公式 duty = high/T,用百分比的格式书写,如50% 60% 80%
第二个问题 什么是脉宽调制
脉宽调制也就是我们说的PWM调制,它和占空比类似,单位是时间单位;一般就是周期T减去高电平持续时间,剩下的就是低电平时间
本程序的占空调节方案就是按照脉宽的思路来写的,可以调节占空比和频率,并且调节频率的时候占空比不发生变化,调节占空比,频率不发生变化
只要周期T固定了那么频率就固定了根据公式T=1/F来计算得到的,
//3个电位器的值
RP1_GetADCResult() 表示ADC电位器的值
RP2_GetADCResult() 表示ADC电位器的值
RP3_GetADCResult() 表示ADC电位器的值
TEMER_COUNT 来自定时器的值 0.2MS变化一次 这样计算的精度会高一点
本程序在不同的频率下占空比误差在2% 个别频率下没有任何误差
void HUN_PIN_MODE()
{
unsigned int T_TIMER, Duty_Max; //临时变量 周期时间变量和占空比最大时间变量
PCA_PIN_LV_UPDETE(RP1_GetADCResult()); //启动设置单频 0-255HZ
RP2_ADC_MAX = RP2_GetADCResult()/40; //限制电位器ADC最大值 本模块为25 1023/40取整为25
//2号电位器在本函数中显示的位副频,频率25hz
T_TIMER = 1000/RP2_ADC_MAX; //设置副频频率 这里的1000是表示1000MS 也就是周期T 固定周期T也就固定了频率
//这句目的是保持占空比在任意频率下保持不变
Duty_Max = (RP3_GetADCResult()/(1023/T_TIMER))*0.8; //让脉宽时间跟随电位器值 来匹配合适的缩小倍率
//保证电位器旋转最小到最大都是均匀分布调节占空
//比值的大小
//乘以0.8表示将占空比最大限制在80%
//在本函数中 Duty_Max用来标定占空比的大小
//占空比转换 并且显示到数码管 *100是将数据先放大100倍在计算
RP3_ADC_MAX = Duty_Max*100/T_TIMER; //把三号电位器的值保存到公共变量里面方便在
//不同模块传入不同的数据更新到数码管上面
/本函数中3号电位器直接显示占空比值到数码管
if(TEMER_COUNT < Duty_Max) //脉宽高电平持续时间设置 也就是调节占空比大小
{
CR = 1; //启动PWM模块
// LED = 1; //混频指示 取消这个指示 改为一直显示
}
else
{ //如果高电平持续时间没有结束 就将CR置0关闭PWM
CR = 0; //关闭PWM 模块
// LED = 0; //波形指示灯
}
if(TEMER_COUNT >= T_TIMER ) //判断脉宽是不是持续到了最大值
{
TEMER_COUNT = 0; //到了就将TEMER_COUNT清零
}
}
|