#include <xc.h>
// Configuration bits
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF
#define _XTAL_FREQ 20000000
void PWM_Init()
{
TRISC2 = 0; // CCP1 pin as output
// PWM Frequency ≈ 5 kHz
PR2 = 249;
CCP1CON = 0x0C; // PWM mode
T2CON = 0x04; // Timer2 ON, Prescaler 1
CCPR1L = 0; // Initial duty cycle
}
void PWM_SetDuty(unsigned int duty)
{
if(duty > 1023)
duty = 1023;
CCPR1L = duty >> 2;
CCP1CONbits.DC1B0 = duty & 0x01;
CCP1CONbits.DC1B1 = (duty & 0x02) >> 1;
}
void ADC_Init()
{
ADCON0 = 0x41; // AN0 selected, ADC ON
ADCON1 = 0x80; // Right justified
}
unsigned int ADC_Read()
{
GO_nDONE = 1;
while(GO_nDONE);
return ((ADRESH << 8) + ADRESL);
}
void main()
{
unsigned int adcValue;
PWM_Init();
ADC_Init();
while(1)
{
adcValue = ADC_Read(); // 0–1023 from potentiometer
PWM_SetDuty(adcValue); // Control motor speed
__delay_ms(10);
}
}
I2luY2x1ZGUgPHhjLmg+CgovLyBDb25maWd1cmF0aW9uIGJpdHMKI3ByYWdtYSBjb25maWcgRk9TQyA9IEhTCiNwcmFnbWEgY29uZmlnIFdEVEUgPSBPRkYKI3ByYWdtYSBjb25maWcgUFdSVEUgPSBPTgojcHJhZ21hIGNvbmZpZyBCT1JFTiA9IE9OCiNwcmFnbWEgY29uZmlnIExWUCA9IE9GRgojcHJhZ21hIGNvbmZpZyBDUEQgPSBPRkYKI3ByYWdtYSBjb25maWcgV1JUID0gT0ZGCiNwcmFnbWEgY29uZmlnIENQID0gT0ZGCgojZGVmaW5lIF9YVEFMX0ZSRVEgMjAwMDAwMDAKCnZvaWQgUFdNX0luaXQoKQp7CiAgICBUUklTQzIgPSAwOyAgICAgIC8vIENDUDEgcGluIGFzIG91dHB1dAoKICAgIC8vIFBXTSBGcmVxdWVuY3kg4omIIDUga0h6CiAgICBQUjIgPSAyNDk7CgogICAgQ0NQMUNPTiA9IDB4MEM7ICAvLyBQV00gbW9kZQoKICAgIFQyQ09OID0gMHgwNDsgICAgLy8gVGltZXIyIE9OLCBQcmVzY2FsZXIgMQoKICAgIENDUFIxTCA9IDA7ICAgICAgLy8gSW5pdGlhbCBkdXR5IGN5Y2xlCn0KCnZvaWQgUFdNX1NldER1dHkodW5zaWduZWQgaW50IGR1dHkpCnsKICAgIGlmKGR1dHkgPiAxMDIzKQogICAgICAgIGR1dHkgPSAxMDIzOwoKICAgIENDUFIxTCA9IGR1dHkgPj4gMjsKCiAgICBDQ1AxQ09OYml0cy5EQzFCMCA9IGR1dHkgJiAweDAxOwogICAgQ0NQMUNPTmJpdHMuREMxQjEgPSAoZHV0eSAmIDB4MDIpID4+IDE7Cn0KCnZvaWQgQURDX0luaXQoKQp7CiAgICBBRENPTjAgPSAweDQxOyAgIC8vIEFOMCBzZWxlY3RlZCwgQURDIE9OCiAgICBBRENPTjEgPSAweDgwOyAgIC8vIFJpZ2h0IGp1c3RpZmllZAp9Cgp1bnNpZ25lZCBpbnQgQURDX1JlYWQoKQp7CiAgICBHT19uRE9ORSA9IDE7CgogICAgd2hpbGUoR09fbkRPTkUpOwoKICAgIHJldHVybiAoKEFEUkVTSCA8PCA4KSArIEFEUkVTTCk7Cn0KCnZvaWQgbWFpbigpCnsKICAgIHVuc2lnbmVkIGludCBhZGNWYWx1ZTsKCiAgICBQV01fSW5pdCgpOwogICAgQURDX0luaXQoKTsKCiAgICB3aGlsZSgxKQogICAgewogICAgICAgIGFkY1ZhbHVlID0gQURDX1JlYWQoKTsgICAgLy8gMOKAkzEwMjMgZnJvbSBwb3RlbnRpb21ldGVyCgogICAgICAgIFBXTV9TZXREdXR5KGFkY1ZhbHVlKTsgICAgLy8gQ29udHJvbCBtb3RvciBzcGVlZAoKICAgICAgICBfX2RlbGF5X21zKDEwKTsKICAgIH0KfQ==