diff --git a/cores/arduino/wiring_analog.cpp b/cores/arduino/wiring_analog.cpp
index 5c694cb7..f155c637 100644
--- a/cores/arduino/wiring_analog.cpp
+++ b/cores/arduino/wiring_analog.cpp
@@ -40,7 +40,7 @@ static mbed::PwmOut* PinNameToPwmObj(PinName P) {
 
 void analogWrite(PinName pin, int val)
 {
-  float percent = (float)val/(float)(1 << write_resolution);
+  float percent = (float)val/(float)((1 << write_resolution)-1);
 #ifdef digitalPinToPwmObj
   mbed::PwmOut* pwm = PinNameToPwmObj(pin);
   if (pwm == NULL) {
@@ -57,7 +57,7 @@ void analogWrite(PinName pin, int val)
 
 void analogWrite(pin_size_t pin, int val)
 {
-  float percent = (float)val/(float)(1 << write_resolution);
+  float percent = (float)val/(float)((1 << write_resolution)-1);
 #ifdef digitalPinToPwmObj
   mbed::PwmOut* pwm = digitalPinToPwmObj(pin);
   if (pwm == NULL) {
@@ -95,4 +95,4 @@ int analogRead(pin_size_t pin)
 void analogReadResolution(int bits)
 {
   read_resolution = bits;
-}
\ No newline at end of file
+}