; Keith Neufeld ; 08-Mar-2006 ; ; LogoChip program to demo motor speed control with PIC PWM output. ; Uses PWM channel 1 on port C2. Duty cycle values determined with ; NPN transistor driver with 9V motor supply. constants [ [CCP1CON $fbd] ; capture/compare/PWM 1 control reg [T2CON $fca] ; timer 2 control register [TMR2ON 2] ; timer 2 enable bit [T2CKPS1 1] ; timer 2 prescale bit 1 [CCPR1L $fbe] ; C/C/P 1 register low byte [PR2 $fcb] ; timer 2 period register [pwm-port-ddr portc-ddr] ; PWM 1 outputs on port C2 [pwm-bit 2] [period 255] ; default timer period to use ;[low-duty 110] ; lowest duty cycle for my motor to [low-duty 10] ; start from a stop [high-duty 255] ; highest possible cycle ] ; Initialize PWM by configuring timer 2 for PWM period and enabling PWM mode. to pwm-init clearbit pwm-bit pwm-port-ddr ; set PWM port to output ;write T2CON 6 ; set timer 2 on, prescalar 16 setbit T2CKPS1 T2CON ; set timer 2 prescalar to 16 write PR2 period ; set timer period highest possible setbit TMR2ON T2CON ; turn on timer 2 write CCP1CON 12 ; set PWM mode ;write CCPR1L 128 ; set 50% duty cycle end ; Set PWM period and duty cycle. to pwm-set :period :duty write PR2 :period ; set timer period write CCPR1L :duty ; set PWM duty cycle end ; Disable PWM by shutting off timer 2. to pwm-off pwm-set 0 0 ; disable PWM by setting duty cyc to 0 clearbit TMR2ON T2CON ; and turn off timer 2 end ; Enable PWM and ramp up to highest speed at :increment / 255ths ; per 1/10 second. global [duty] to pwm-speedup :increment setduty low-duty pwm-set period duty repeat ((high-duty - low-duty) / :increment) [ wait 1 setduty duty + :increment pwm-set period duty ] setduty high-duty end ; Enable PWM and ramp down from highest speed at :increment / 255ths ; per 1/10 second. to pwm-slowdown :increment setduty high-duty pwm-set period duty repeat ((high-duty - low-duty) / :increment) [ wait 1 setduty duty - :increment pwm-set period duty ] setduty low-duty end