PWM test code

Dependencies:   mbed TextLCD mRotaryEncoder

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?

UserRevisionLine numberNew 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 }