I'm using a PIC16F628A (with a 20Mhz ceramic resonator; will switch to a oscillator + caps later on) to drive a small DC motor and I've incorporated a rotary encoder to adjust the duty cycle during run time. I've been told that I need to use high frequencies (> 20kHz) to reduce the motor whine, but I'm not sure if it's actually using the value of 32767 I've coded below. Is there a way to find out what the max frequency is for a PIC? The data sheet isn't clear on what are the maximum values or if only specific frequencies are allowed.
Code:'---------Initialization-------- DEFINE OSC 20 ' set oscillator 20Mhz ' *************************************************************** ' Device Fuses ' *************************************************************** @ __config _HS_OSC & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BODEN_ON & _LVP_OFF & _CP_OFF & _CPD_OFF CMCON = 7 ' Turn off comparators TRISA = %00000000 ' Make all PortA pins output TRISB = %00110000 ' Make PortB pins 4-5 input Old_Bits VAR BYTE New_Bits VAR BYTE RotEncDir VAR BIT ' 1=CW, 0=CCW ' Rot Enc pin A connected to PortB.5; ' Rot Enc pin B connected to PortB.4 p0 VAR BYTE Old_p0 VAR BYTE '*************************************************************************** ' SETUP YOUR LCD HERE!!! '*************************************************************************** ;Define LCD_DREG PORTA ;Define LCD_DBIT 0 ;Define LCD_RSREG PORTA ;define LCD_RSBIT 4 DEFINE LCD_EREG PORTB DEFINE LCD_EBIT 7 ' Use PortB.7 as the Enable (E) bit since PortB.3 ' on the 16F628A is the one-and-only HPWM output ;define LCD_BITS 4 ;define LCD_LINES 2 ;define LCD_COMMANDUS 2000 ;define LCD_DATAUS 50 INCLUDE "DT_INTS-14.bas" ' Base Interrupt System INCLUDE "ReEnterPBP.bas" ' Include if using PBP interrupts ' --> copy both files to PBP main folder ' (i.e. c:\pbp) ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _Rot_Encoder, PBP, yes endm INT_CREATE ; Creates the interrupt processor ENDASM @ INT_ENABLE RBC_INT ;RB Port Change Interrupt ' Set default values Old_Bits = PORTB & (%11110000) p0= 60 Old_p0 = p0 LCDOUT $FE, 1 PAUSE 1000 GOSUB motorhpwm Main: IF p0 <> Old_p0 Then Old_p0 = p0 GOSUB motorhpwm EndIF LCDOUT $FE, 2, "p0: ", #p0, " " pause 10 GOTO Main motorhpwm: HPWM 1, p0, 32767 ; Tried 245 Hz but it made the motor too loud. ; Supposedly, anything above 20kHz is above human hearing RETURN end '---[RBC - interrupt handler]--------------------------------------------------- Rot_Encoder: New_Bits = PORTB & (%11110000) IF (New_Bits & %00110000) = (Old_Bits & %00110000) Then DoneRotEnc RotEncDir = New_Bits.5 ^ Old_Bits.4 IF RotEncDir = 1 Then ; CW rotation - increase speed but only to a max of 255 IF p0 < 255 then p0 = p0 + 1 Else ' CCW rotation - decrease speed to a min of 0 IF p0 > 0 Then p0 = p0 - 1 EndIF DoneRotEnc: Old_Bits = New_Bits @ INT_RETURN




Bookmarks