j'ai remanié un peu ma page concernant le PWM 10 bits avec usage de PWM5 , Timer2 ( ou 4)
nota : par defaut le Timer2 est affecté à un PWMx
source dans le lien ci dessus
sortie signal sur RC5
(choix autre sortie dans le source via PPS commandes)
FOSC interne 64MHz
la periode PWM est de 1024 µS soit 977HZ avec T2PR=255
j'ai Prescaler=6 (P6) soit division de 1/64 au demarrage
le programme de test permet , via liaison UART <-> prolific cable USB/TTL <-> Terminal PC YAT
d'envoyer des commandes pour modifier la config du PWM5
la commande Cxxxx =consigne duty cycle x de 0 à 1019 ..voir 1020
problemo #1 :
au dela de 1019 le PWM sort 0 ? je ne vois pas ou est là limite , hormis un probleme lié à la synchro avec FOSC
avez vous déja eu ce constat,
on devrait pouvoir aller à 1022 (..voir 1023) ?
d'autant qu' une consigne de 1 via cde C1 donne bien une pulse de 1,024µS
Cde C512 -> duree pulse état 1= 512µS
Cde 1019 -> 1019µS
Cde 1020 -> 0 !!!
la commande Px permet de choisir le Prescaler Timer2 parmi les 8 valeurs possible 1,2,4,8,16,32,64,128
la commande Sx : permet de chosir la source de frequence pour le timer2
S1 => FOSC/4 = 16Mhz
S5 => MFINTOSC = 500Khz
S6 => MFINTOSC =32Khz
le mixage Px et SX permet moult possibilités
ce qui permet entre autre de pouvoir piloter un servomoteur de radiocommande ..
Mais ATTENTION , certaines combinaisons ne matchent pas !
et ne supportent plus une resolution effective de 10 bits .
voir datasheet
problemo #2 :
J'ai essayé d'utiliser le Format PWM 10 bits FMT=0 ( au lieu de FMT=1)
je m'attendais à avoir le meme resultat en modifiant aussi , le mode d'ecriture de la valeur consigne Duty
Code : Tout sélectionner
void PWM5_Load_Duty_Value(unsigned int Duty_Value)
{
// suivant config FORMAT voir FIGURE 23-5: PWM 10-BIT ALIGNMENT p349
if (CCP2CON.CCP2FMT==1)
{ UART1_Write('1');
PWM5DCH = (Duty_Value & 0x03FF)>>2; // Writing to 8 MSBs of PWM duty cycle in PWMDCH register
PWM5DCL = (Duty_Value & 0x0003)<<6; // Writing to 2 LSBs of PWM duty cycle in PWMDCL register
}
else
{ UART1_Write('0');
PWM5DCH = (Duty_Value & 0x03FF)>>6 ; // Writing 2 bits MSB of PWM duty cycle
PWM5DCL = (Duty_Value & 0x00FF); // Writing 8 LSB of PWM duty cycle
}
}
et NON , ça ne marche pas ...avec FMT=0, OK seulement avec FMT=1d'ou ma question :
datasheet mal interprétée ?

