@@ -53,10 +53,12 @@ STATIC void mp_machine_pwm_print(const mp_print_t *print, mp_obj_t self_in, mp_p
53
53
}
54
54
55
55
STATIC void mp_machine_pwm_init_helper (machine_pwm_obj_t * self , size_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
56
- enum { ARG_freq , ARG_duty };
56
+ enum { ARG_freq , ARG_duty , ARG_duty_u16 , ARG_duty_ns };
57
57
static const mp_arg_t allowed_args [] = {
58
58
{ MP_QSTR_freq , MP_ARG_INT , {.u_int = -1 } },
59
59
{ MP_QSTR_duty , MP_ARG_INT , {.u_int = -1 } },
60
+ { MP_QSTR_duty_u16 , MP_ARG_INT , {.u_int = -1 } },
61
+ { MP_QSTR_duty_ns , MP_ARG_INT , {.u_int = -1 } },
60
62
};
61
63
mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
62
64
mp_arg_parse_all (n_args , pos_args , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
@@ -74,6 +76,15 @@ STATIC void mp_machine_pwm_init_helper(machine_pwm_obj_t *self, size_t n_args, c
74
76
if (args [ARG_duty ].u_int != -1 ) {
75
77
pwm_set_duty (args [ARG_duty ].u_int , self -> channel );
76
78
}
79
+ if (args [ARG_duty_u16 ].u_int != -1 ) {
80
+ pwm_set_duty (args [ARG_duty ].u_int * 100 / 65536 , self -> channel );
81
+ }
82
+ if (args [ARG_duty_u16 ].u_int != -1 ) {
83
+ uint32_t freq = pwm_get_freq (0 );
84
+ if (freq > 0 ) {
85
+ pwm_set_duty (args [ARG_duty ].u_int * freq / 10000000 , self -> channel );
86
+ }
87
+ }
77
88
78
89
if (pin_mode [self -> pin -> phys_port ] == GPIO_MODE_OPEN_DRAIN ) {
79
90
mp_hal_pin_open_drain (self -> pin -> phys_port );
@@ -121,23 +132,47 @@ STATIC void mp_machine_pwm_freq_set(machine_pwm_obj_t *self, mp_int_t freq) {
121
132
pwm_start ();
122
133
}
123
134
124
- STATIC mp_obj_t mp_machine_pwm_duty_get (machine_pwm_obj_t * self ) {
135
+ STATIC void set_active (machine_pwm_obj_t * self , bool set_pin ) {
125
136
if (!self -> active ) {
126
137
pwm_add (self -> pin -> phys_port , self -> pin -> periph , self -> pin -> func );
127
138
self -> active = 1 ;
128
-
129
- if (pin_mode [self -> pin -> phys_port ] == GPIO_MODE_OPEN_DRAIN ) {
139
+ if (set_pin && pin_mode [self -> pin -> phys_port ] == GPIO_MODE_OPEN_DRAIN ) {
130
140
mp_hal_pin_open_drain (self -> pin -> phys_port );
131
141
}
132
142
}
143
+ }
144
+
145
+ STATIC mp_obj_t mp_machine_pwm_duty_get (machine_pwm_obj_t * self ) {
146
+ set_active (self , true);
133
147
return MP_OBJ_NEW_SMALL_INT (pwm_get_duty (self -> channel ));
134
148
}
135
149
136
150
STATIC void mp_machine_pwm_duty_set (machine_pwm_obj_t * self , mp_int_t duty ) {
137
- if (!self -> active ) {
138
- pwm_add (self -> pin -> phys_port , self -> pin -> periph , self -> pin -> func );
139
- self -> active = 1 ;
140
- }
151
+ set_active (self , false);
141
152
pwm_set_duty (duty , self -> channel );
142
153
pwm_start ();
143
154
}
155
+
156
+ STATIC mp_obj_t mp_machine_pwm_duty_get_u16 (machine_pwm_obj_t * self ) {
157
+ set_active (self , true);
158
+ return MP_OBJ_NEW_SMALL_INT (pwm_get_duty (self -> channel ) * 65536 / 1024 );
159
+ }
160
+
161
+ STATIC void mp_machine_pwm_duty_set_u16 (machine_pwm_obj_t * self , mp_int_t duty ) {
162
+ set_active (self , false);
163
+ pwm_set_duty (duty * 1024 / 65536 , self -> channel );
164
+ pwm_start ();
165
+ }
166
+
167
+ STATIC mp_obj_t mp_machine_pwm_duty_get_ns (machine_pwm_obj_t * self ) {
168
+ set_active (self , true);
169
+ uint32_t freq = pwm_get_freq (0 );
170
+ return MP_OBJ_NEW_SMALL_INT (pwm_get_duty (self -> channel ) * 976563 / freq );
171
+ }
172
+
173
+ STATIC void mp_machine_pwm_duty_set_ns (machine_pwm_obj_t * self , mp_int_t duty ) {
174
+ set_active (self , false);
175
+ uint32_t freq = pwm_get_freq (0 );
176
+ pwm_set_duty (duty * freq / 976562 , self -> channel ); // 1e9/1024 = 976562.5
177
+ pwm_start ();
178
+ }
0 commit comments