PWM test code
Dependencies: mbed TextLCD mRotaryEncoder
main.cpp@1:42a135eee439, 2022-03-02 (annotated)
- Committer:
- RogerJKelly
- Date:
- Wed Mar 02 21:58:48 2022 +0000
- Revision:
- 1:42a135eee439
- Parent:
- 0:376d7a150177
PWM test code
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
oscarvzfz | 0:376d7a150177 | 1 | #include "mbed.h" |
oscarvzfz | 0:376d7a150177 | 2 | #include "TextLCD.h" |
RogerJKelly | 1:42a135eee439 | 3 | #include "mRotaryEncoder.h" |
RogerJKelly | 1:42a135eee439 | 4 | |
RogerJKelly | 1:42a135eee439 | 5 | DigitalOut fan_enable(PA_8); // high to enable fan, low to turn off |
RogerJKelly | 1:42a135eee439 | 6 | PwmOut fan_pwm(PB_15); //D9 D13); |
RogerJKelly | 1:42a135eee439 | 7 | // I2C Communication |
RogerJKelly | 1:42a135eee439 | 8 | I2C i2c_lcd(PB_7,PB_6); // SDA, SCL |
RogerJKelly | 1:42a135eee439 | 9 | |
RogerJKelly | 1:42a135eee439 | 10 | TextLCD_I2C lcd(&i2c_lcd, 0x4E, TextLCD::LCD16x2, TextLCD::HD44780); // I2C bus, PCF8574 Slaveaddress, LCD Type, Device Type |
RogerJKelly | 1:42a135eee439 | 11 | |
RogerJKelly | 1:42a135eee439 | 12 | // Here's the encoder object |
RogerJKelly | 1:42a135eee439 | 13 | //mRotaryEncoder enc(D7,D8, D2,PullNone); |
RogerJKelly | 1:42a135eee439 | 14 | //RPG rpg1(PA_3,PA_4,PA_7); //Set up RPG |
RogerJKelly | 1:42a135eee439 | 15 | //mRotaryEncoder enc(PA_3,PA_4,PA_7,PullUp); |
RogerJKelly | 1:42a135eee439 | 16 | mRotaryEncoder enc(PB_12,PB_13,PB_14,PullUp); |
RogerJKelly | 1:42a135eee439 | 17 | |
RogerJKelly | 1:42a135eee439 | 18 | float fan_speed = 0.00; |
RogerJKelly | 1:42a135eee439 | 19 | float fan_speed_old = 0.00; |
RogerJKelly | 1:42a135eee439 | 20 | int fan_pwr=0; // |
RogerJKelly | 1:42a135eee439 | 21 | char buffer[20]; |
oscarvzfz | 0:376d7a150177 | 22 | |
oscarvzfz | 0:376d7a150177 | 23 | |
RogerJKelly | 1:42a135eee439 | 24 | // LCD print helper |
RogerJKelly | 1:42a135eee439 | 25 | void lcd_printS(int line, int col, char text[]) |
RogerJKelly | 1:42a135eee439 | 26 | { |
RogerJKelly | 1:42a135eee439 | 27 | lcd.locate(col, line); //locate(int column, int row); |
RogerJKelly | 1:42a135eee439 | 28 | lcd.printf(text); |
RogerJKelly | 1:42a135eee439 | 29 | //for (i=0;i<strlen(text);i++) |
RogerJKelly | 1:42a135eee439 | 30 | // printC(text[i]); |
RogerJKelly | 1:42a135eee439 | 31 | } |
oscarvzfz | 0:376d7a150177 | 32 | |
RogerJKelly | 1:42a135eee439 | 33 | // Helper function to set the PWM values |
RogerJKelly | 1:42a135eee439 | 34 | void setfanspeed() |
RogerJKelly | 1:42a135eee439 | 35 | { |
RogerJKelly | 1:42a135eee439 | 36 | //if (fan_pwr>0) fan_pwm.write(fan_speed); |
RogerJKelly | 1:42a135eee439 | 37 | fan_pwm.write(fan_speed); |
RogerJKelly | 1:42a135eee439 | 38 | //fan_pwm.write(1.00 - fan_speed); |
RogerJKelly | 1:42a135eee439 | 39 | } |
RogerJKelly | 1:42a135eee439 | 40 | |
RogerJKelly | 1:42a135eee439 | 41 | // Library calls here when you go clockwise |
RogerJKelly | 1:42a135eee439 | 42 | void cw() |
RogerJKelly | 1:42a135eee439 | 43 | { |
RogerJKelly | 1:42a135eee439 | 44 | // modify the selected RGB component |
RogerJKelly | 1:42a135eee439 | 45 | if (fan_pwr>0) |
RogerJKelly | 1:42a135eee439 | 46 | { |
RogerJKelly | 1:42a135eee439 | 47 | fan_speed +=0.010; |
RogerJKelly | 1:42a135eee439 | 48 | if (fan_speed>0.95) fan_speed=0.950; |
RogerJKelly | 1:42a135eee439 | 49 | } |
RogerJKelly | 1:42a135eee439 | 50 | setfanspeed(); |
RogerJKelly | 1:42a135eee439 | 51 | } |
RogerJKelly | 1:42a135eee439 | 52 | |
RogerJKelly | 1:42a135eee439 | 53 | // Library calls here when you go anticlockwise |
RogerJKelly | 1:42a135eee439 | 54 | void ccw() |
RogerJKelly | 1:42a135eee439 | 55 | { |
RogerJKelly | 1:42a135eee439 | 56 | // modify the selected RGB component |
RogerJKelly | 1:42a135eee439 | 57 | if (fan_pwr>0) |
RogerJKelly | 1:42a135eee439 | 58 | { |
RogerJKelly | 1:42a135eee439 | 59 | fan_speed -=0.010; |
RogerJKelly | 1:42a135eee439 | 60 | if (fan_speed<0.05) fan_speed=0.050; |
RogerJKelly | 1:42a135eee439 | 61 | } |
RogerJKelly | 1:42a135eee439 | 62 | setfanspeed(); |
RogerJKelly | 1:42a135eee439 | 63 | } |
RogerJKelly | 1:42a135eee439 | 64 | |
RogerJKelly | 1:42a135eee439 | 65 | // Library calls here when you push in on the encoder shaft |
RogerJKelly | 1:42a135eee439 | 66 | void btn() |
RogerJKelly | 1:42a135eee439 | 67 | { |
RogerJKelly | 1:42a135eee439 | 68 | // change selected component (0, 1, 2) |
RogerJKelly | 1:42a135eee439 | 69 | if (++fan_pwr>1) |
RogerJKelly | 1:42a135eee439 | 70 | { |
RogerJKelly | 1:42a135eee439 | 71 | fan_enable = 0; // turn fan OFF |
RogerJKelly | 1:42a135eee439 | 72 | fan_pwr=0; |
RogerJKelly | 1:42a135eee439 | 73 | fan_speed_old = fan_speed; |
RogerJKelly | 1:42a135eee439 | 74 | fan_speed = 0.00; |
RogerJKelly | 1:42a135eee439 | 75 | } |
RogerJKelly | 1:42a135eee439 | 76 | else |
RogerJKelly | 1:42a135eee439 | 77 | { |
RogerJKelly | 1:42a135eee439 | 78 | fan_enable = 1; // turn fan ON |
RogerJKelly | 1:42a135eee439 | 79 | fan_speed = fan_speed_old; |
RogerJKelly | 1:42a135eee439 | 80 | } |
RogerJKelly | 1:42a135eee439 | 81 | setfanspeed(); |
RogerJKelly | 1:42a135eee439 | 82 | } |
RogerJKelly | 1:42a135eee439 | 83 | |
oscarvzfz | 0:376d7a150177 | 84 | |
oscarvzfz | 0:376d7a150177 | 85 | |
oscarvzfz | 0:376d7a150177 | 86 | int main() |
oscarvzfz | 0:376d7a150177 | 87 | { |
RogerJKelly | 1:42a135eee439 | 88 | fan_enable = 0; // turn fan off |
RogerJKelly | 1:42a135eee439 | 89 | //fan_pwm.period(0.01); // setup PWM in seconds. 0.01 == 100hz |
RogerJKelly | 1:42a135eee439 | 90 | //fan_pwm.period_ms(100); // setup PWM in milli seconds. 1 == 1 khz |
RogerJKelly | 1:42a135eee439 | 91 | // Note: the PWM using the 555 supplied by RIXENS runs around 200khz |
RogerJKelly | 1:42a135eee439 | 92 | // - running the pwm at 100khz looses resolution at the top and bottom. |
RogerJKelly | 1:42a135eee439 | 93 | // - running the pwm at 10khz has much more accuracy and resolution. |
RogerJKelly | 1:42a135eee439 | 94 | // - running the pwm at 20khz has same accuracy and resolution as 10khz. |
RogerJKelly | 1:42a135eee439 | 95 | fan_pwm.period_us(100); // setup PWM in micro seconds. 100 == 10khz, 50 == 20khz,10 == 100khz, 5 == 200khz, |
RogerJKelly | 1:42a135eee439 | 96 | |
RogerJKelly | 1:42a135eee439 | 97 | setfanspeed(); |
RogerJKelly | 1:42a135eee439 | 98 | // Set up encoder callbacks |
RogerJKelly | 1:42a135eee439 | 99 | enc.attachROTCW(cw); |
RogerJKelly | 1:42a135eee439 | 100 | enc.attachROTCCW(ccw); |
RogerJKelly | 1:42a135eee439 | 101 | enc.attachSW(btn); |
RogerJKelly | 1:42a135eee439 | 102 | |
RogerJKelly | 1:42a135eee439 | 103 | lcd.setMode(TextLCD::DispOn); //DispOff, DispOn |
RogerJKelly | 1:42a135eee439 | 104 | lcd.setBacklight(TextLCD::LightOff);//LightOff, LightOn |
RogerJKelly | 1:42a135eee439 | 105 | lcd.setCursor(TextLCD::CurOff_BlkOff);//CurOff_BlkOff, CurOn_BlkOff, CurOff_BlkOn, CurOn_BlkOn |
RogerJKelly | 1:42a135eee439 | 106 | //lcd.printf("Testing I2C LCD"); |
RogerJKelly | 1:42a135eee439 | 107 | //lcd.locate(0, 1); //locate(int column, int row); |
RogerJKelly | 1:42a135eee439 | 108 | //lcd.printf("does it work"); |
RogerJKelly | 1:42a135eee439 | 109 | //lcd.setBacklight(TextLCD::LightOn);//LightOff, LightOn |
RogerJKelly | 1:42a135eee439 | 110 | |
RogerJKelly | 1:42a135eee439 | 111 | lcd.cls(); |
RogerJKelly | 1:42a135eee439 | 112 | lcd_printS(0,0,"Fan Setting:"); |
RogerJKelly | 1:42a135eee439 | 113 | lcd_printS(1,0,"Fan Speed: "); |
oscarvzfz | 0:376d7a150177 | 114 | |
RogerJKelly | 1:42a135eee439 | 115 | while (true) // nothing else to do but wait |
RogerJKelly | 1:42a135eee439 | 116 | { |
RogerJKelly | 1:42a135eee439 | 117 | wait(0.25); |
RogerJKelly | 1:42a135eee439 | 118 | if (fan_pwr>0) lcd_printS(0,12," ON "); |
RogerJKelly | 1:42a135eee439 | 119 | else lcd_printS(0,12," OFF"); |
RogerJKelly | 1:42a135eee439 | 120 | sprintf(buffer,"%3d", (int)(fan_speed * 100)); |
RogerJKelly | 1:42a135eee439 | 121 | lcd_printS(1,12,buffer); |
RogerJKelly | 1:42a135eee439 | 122 | //LCD.printS(1, 0, buffer); |
RogerJKelly | 1:42a135eee439 | 123 | } |
RogerJKelly | 1:42a135eee439 | 124 | } |