用单片机定时器0做了个PWM模拟输出实现了50HZ输出周期为20Ms,占空比刚刚好对应为0-255级此变量"PWM_DUTY"对应0-255变化脉宽对应0-100变化没什么问题了.问题1:怎么才能结合ADC对外部电位器采样的数值0-255映射到对应的脉宽0-100之间电位器满程调节呢?
问题2:比如需要限制某一个脉宽值比如脉宽1Ms-2.5M变化怎么才能把ADC数值映射到0-255满程调节呢?
sbit PWM_OUT_GPIO=P2^0;
unsigned char PWM_DUTY=128;//此时脉宽刚刚好百分之50
uint8 ADC_Value=0;
void XPT2046_Allot()//XPT2046-ADC芯片数据分频函数
{
ADC_Value=Start_XPT2046_ADC(PIN0_0_XP_ADC_8BIT,8);//启动ADC转换芯片函数 此函数第一个形参设置模式和通道 第二个为设置转换的位数 范围8-12
}
void Timer0Init() //100微秒@12MHz"八位自动"
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x02; //设置定时器模式
TL0 = 0xb2; //设置定时初始值
TH0 = 0xb2; //设置定时重载值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0不启动
ET0 = 1; //允许定时器0申请中断
EA = 1; //开启所有中断
}
void main()
{
while(1)
{
XPT2046_Allot();//XPT2046-ADC芯片数据分频函数
}
}
void Timer0Interrupt() interrupt 1
{
if(PWM_Cnt<PWM_DUTY)
{
PWM_OUT_GPIO=1;
}
else
{
PWM_OUT_GPIO=0;
}
PWM_Cnt++;
}
|