本帖最后由 boya355 于 2024-10-3 16:39 编辑
如下的九齐单片机程序,ADC取样控制PWM占空比, 但是就不能实现, 我掉进了什么坑! 出不来呢? ! 请九齐高人指点迷津
// -----------AIN2_Convert----------------
void F_AIN2_Convert(char count)
{ ADC_Initial();
char i;
ADMD = 0x90 | C_ADC_PA2; // also ADMD=92// Select AIN2(PA2) pad as ADC input
for(i=1;i<=count; i++)
{
ADMDbits.START = 1; // Start a ADC conversion session
delay(50); // Delay 0.56ms(clock=4MHz/2T) for waiting ADC stable
F_wait_eoc(); // Wait for ADC conversion complete
R_AIN2_DATA += ADD;
}
}
//----------read adc---------------- ------
unsigned int ADC_Get_Resault()
{
CLRWDT(); // Clear watchdog timer, R_AIN2_DATA = 0x00;
F_AIN2_Convert(8); // Execute 8-times of AIN2 ADC conversion
R_AIN2_DATA >>= 3; // R_AIN2_DATA divided 8
return R_AIN2_DATA;
}
void F_wait_eoc(void)
{
while(ADMDbits.EOC==0);
}
//----------------Pwm_Init----------
void PWM1_Init()
{ TMRH = 0x00;
TMR1 = 0xff; // @ 16KHZ
PWM1DUTY = 0x7D; // PWM1DUTY[9:0] = 001h
T1CR2 = C_PS1_Dis | C_TMR1_ClkSrc_Inst; // Prescaler 1:1, Timer1 clock source is instruction clock
T1CR1 = C_PWM1_En | C_PWM1_Active_Hi | C_TMR1_Reload | C_TMR1_En; // Enable PWM1, Active_High,Reloaded
}
// --------------interrupt AIN2 - ADC service routine--------------------
void isr(void)__interrupt(0) // ADC of AIN2 and timer1 together Interrput !!!
{
if(ADRbits.ADIF)
{
ADRbits.ADIF =0;
}
if(INTFbits.T1IF)
{ INTFbits.T1IF =0;
PWM1DUTY =(unsigned short)ADC_Get_Resault();
}
}
//--------------Update_Pwm1()-----------------------------------------
void Update_PWM1()
{
PWM1DUTY =ADC_Get_Resault();
}
以上为关键函数,其他函数基本验证过。 目前问题:ADC读取的数据(疑点一能否读出?), update 不了 PWM1DUTY(疑点二) ?
本程序中使用了两种方法, 其一是中断函数中更新, 其二是 单独void Update_PWM1() 均不能实现
我究竟犯了谁的错???
|