|
用單片機(jī)定時(shí)器0做了個(gè)PWM模擬輸出實(shí)現(xiàn)了50HZ輸出周期為20Ms,占空比剛剛好對(duì)應(yīng)為0-255級(jí)此變量"PWM_DUTY"對(duì)應(yīng)0-255變化脈寬對(duì)應(yīng)0-100變化沒(méi)什么問(wèn)題了.問(wèn)題1:怎么才能結(jié)合ADC對(duì)外部電位器采樣的數(shù)值0-255映射到對(duì)應(yīng)的脈寬0-100之間電位器滿程調(diào)節(jié)呢?
問(wèn)題2:比如需要限制某一個(gè)脈寬值比如脈寬1Ms-2.5M變化怎么才能把ADC數(shù)值映射到0-255滿程調(diào)節(jié)呢?
sbit PWM_OUT_GPIO=P2^0;
unsigned char PWM_DUTY=128;//此時(shí)脈寬剛剛好百分之50
uint8 ADC_Value=0;
void XPT2046_Allot()//XPT2046-ADC芯片數(shù)據(jù)分頻函數(shù)
{
ADC_Value=Start_XPT2046_ADC(PIN0_0_XP_ADC_8BIT,8);//啟動(dòng)ADC轉(zhuǎn)換芯片函數(shù) 此函數(shù)第一個(gè)形參設(shè)置模式和通道 第二個(gè)為設(shè)置轉(zhuǎn)換的位數(shù) 范圍8-12
}
void Timer0Init() //100微秒@12MHz"八位自動(dòng)"
{
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TMOD |= 0x02; //設(shè)置定時(shí)器模式
TL0 = 0xb2; //設(shè)置定時(shí)初始值
TH0 = 0xb2; //設(shè)置定時(shí)重載值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0不啟動(dòng)
ET0 = 1; //允許定時(shí)器0申請(qǐng)中斷
EA = 1; //開(kāi)啟所有中斷
}
void main()
{
while(1)
{
XPT2046_Allot();//XPT2046-ADC芯片數(shù)據(jù)分頻函數(shù)
}
}
void Timer0Interrupt() interrupt 1
{
if(PWM_Cnt<PWM_DUTY)
{
PWM_OUT_GPIO=1;
}
else
{
PWM_OUT_GPIO=0;
}
PWM_Cnt++;
}
|
|