22
22
23
23
static float pwm_clock = 0 ;
24
24
25
- void pwmout_init (pwmout_t * obj , PinName pin ) {
25
+ void pwmout_init (pwmout_t * obj , PinName pin )
26
+ {
26
27
// determine the channel
27
28
PWMName pwm = (PWMName )pinmap_peripheral (pin , PinMap_PWM );
28
29
MBED_ASSERT (pwm != (PWMName )NC );
@@ -36,8 +37,9 @@ void pwmout_init(pwmout_t* obj, PinName pin) {
36
37
while (clkval > 1 ) {
37
38
clkdiv ++ ;
38
39
clkval /= 2.0 ;
39
- if (clkdiv == 7 )
40
+ if (clkdiv == 7 ) {
40
41
break ;
42
+ }
41
43
}
42
44
43
45
pwm_clock = clkval ;
@@ -53,7 +55,7 @@ void pwmout_init(pwmout_t* obj, PinName pin) {
53
55
ftm -> MODE = FTM_MODE_FTMEN_MASK ;
54
56
ftm -> SYNC = FTM_SYNC_CNTMIN_MASK ;
55
57
ftm -> SYNCONF = FTM_SYNCONF_SYNCMODE_MASK | FTM_SYNCONF_SWSOC_MASK | FTM_SYNCONF_SWWRBUF_MASK ;
56
-
58
+
57
59
//Without SYNCEN set CnV does not seem to update
58
60
ftm -> COMBINE = FTM_COMBINE_SYNCEN0_MASK | FTM_COMBINE_SYNCEN1_MASK | FTM_COMBINE_SYNCEN2_MASK | FTM_COMBINE_SYNCEN3_MASK ;
59
61
@@ -64,60 +66,86 @@ void pwmout_init(pwmout_t* obj, PinName pin) {
64
66
// default to 20ms: standard for servos, and fine for e.g. brightness control
65
67
pwmout_period_ms (obj , 20 );
66
68
pwmout_write (obj , 0.0 );
67
-
69
+
68
70
// Wire pinout
69
71
pinmap_pinout (pin , PinMap_PWM );
70
72
}
71
73
72
- void pwmout_free (pwmout_t * obj ) {}
74
+ void pwmout_free (pwmout_t * obj ) {}
73
75
74
- void pwmout_write (pwmout_t * obj , float value ) {
76
+ void pwmout_write (pwmout_t * obj , float value )
77
+ {
75
78
if (value < 0.0 ) {
76
79
value = 0.0 ;
77
80
} else if (value > 1.0 ) {
78
81
value = 1.0 ;
79
82
}
80
-
81
- while (* obj -> SYNC & FTM_SYNC_SWSYNC_MASK );
83
+
84
+ while (* obj -> SYNC & FTM_SYNC_SWSYNC_MASK );
82
85
* obj -> CnV = (uint32_t )((float )(* obj -> MOD + 1 ) * value );
83
- * obj -> SYNC |= FTM_SYNC_SWSYNC_MASK ;
86
+ * obj -> SYNC |= FTM_SYNC_SWSYNC_MASK ;
84
87
}
85
88
86
- float pwmout_read (pwmout_t * obj ) {
87
- while (* obj -> SYNC & FTM_SYNC_SWSYNC_MASK );
89
+ float pwmout_read (pwmout_t * obj )
90
+ {
91
+ while (* obj -> SYNC & FTM_SYNC_SWSYNC_MASK );
88
92
float v = (float )(* obj -> CnV ) / (float )(* obj -> MOD + 1 );
89
93
return (v > 1.0 ) ? (1.0 ) : (v );
90
94
}
91
95
92
- void pwmout_period (pwmout_t * obj , float seconds ) {
96
+ void pwmout_period (pwmout_t * obj , float seconds )
97
+ {
93
98
pwmout_period_us (obj , seconds * 1000000.0f );
94
99
}
95
100
96
- void pwmout_period_ms (pwmout_t * obj , int ms ) {
101
+ void pwmout_period_ms (pwmout_t * obj , int ms )
102
+ {
97
103
pwmout_period_us (obj , ms * 1000 );
98
104
}
99
105
100
106
// Set the PWM period, keeping the duty cycle the same.
101
- void pwmout_period_us (pwmout_t * obj , int us ) {
107
+ void pwmout_period_us (pwmout_t * obj , int us )
108
+ {
102
109
float dc = pwmout_read (obj );
103
110
* obj -> MOD = (uint32_t )(pwm_clock * (float )us ) - 1 ;
104
111
* obj -> SYNC |= FTM_SYNC_SWSYNC_MASK ;
105
112
pwmout_write (obj , dc );
106
113
}
107
114
108
- void pwmout_pulsewidth (pwmout_t * obj , float seconds ) {
115
+ int pwmout_read_period_us (pwmout_t * obj )
116
+ {
117
+ uint32_t pwm_period = 0 ;
118
+ if (pwm_clock > 0 ) {
119
+ pwm_period = ((* obj -> MOD ) + 1 ) / pwm_clock ;
120
+ }
121
+ return pwm_period ;
122
+ }
123
+
124
+ void pwmout_pulsewidth (pwmout_t * obj , float seconds )
125
+ {
109
126
pwmout_pulsewidth_us (obj , seconds * 1000000.0f );
110
127
}
111
128
112
- void pwmout_pulsewidth_ms (pwmout_t * obj , int ms ) {
129
+ void pwmout_pulsewidth_ms (pwmout_t * obj , int ms )
130
+ {
113
131
pwmout_pulsewidth_us (obj , ms * 1000 );
114
132
}
115
133
116
- void pwmout_pulsewidth_us (pwmout_t * obj , int us ) {
134
+ void pwmout_pulsewidth_us (pwmout_t * obj , int us )
135
+ {
117
136
* obj -> CnV = (uint32_t )(pwm_clock * (float )us );
118
137
* obj -> SYNC |= FTM_SYNC_SWSYNC_MASK ;
119
138
}
120
139
140
+ int pwmout_read_pulsewidth_us (pwmout_t * obj )
141
+ {
142
+ uint32_t pwm_pulsewidth = 0 ;
143
+ if (pwm_clock > 0 ) {
144
+ pwm_pulsewidth = (* obj -> CnV ) / pwm_clock ;
145
+ }
146
+ return pwm_pulsewidth ;
147
+ }
148
+
121
149
const PinMap * pwmout_pinmap ()
122
150
{
123
151
return PinMap_PWM ;
0 commit comments