|
@@ -8,14 +8,14 @@
|
|
|
|
|
|
|
|
|
out_t outputs[DO_NUMBER] = {
|
|
|
- {GPIOC, GPIO_PINS_12, 0, 0, 0, false}, // -
|
|
|
- {GPIOD, GPIO_PINS_2, 0, 0, 0, false}, // -
|
|
|
- {GPIOE, GPIO_PINS_6, 0, 0, 0, false}, // TMR9_CH2 (remap)
|
|
|
- {GPIOC, GPIO_PINS_1, 0, 0, 0, false}, // -
|
|
|
- {GPIOC, GPIO_PINS_11, 0, 0, 0, false}, // -
|
|
|
- {GPIOD, GPIO_PINS_3, 0, 0, 0, false}, // -
|
|
|
- {GPIOE, GPIO_PINS_5, 0, 0, 0, false}, // TMR9_CH1 (remap)
|
|
|
- {GPIOC, GPIO_PINS_2, 0, 0, 0, false} // -
|
|
|
+ {GPIOC, GPIO_PINS_12, 0, 0, 0, false, 0, 0}, // -
|
|
|
+ {GPIOD, GPIO_PINS_2, 0, 0, 0, false, 0, 0}, // -
|
|
|
+ {GPIOE, GPIO_PINS_6, 0, 0, 0, false, 0, 0}, // TMR9_CH2 (remap)
|
|
|
+ {GPIOC, GPIO_PINS_1, 0, 0, 0, false, 0, 0}, // -
|
|
|
+ {GPIOC, GPIO_PINS_11, 0, 0, 0, false, 0, 0}, // -
|
|
|
+ {GPIOD, GPIO_PINS_3, 0, 0, 0, false, 0, 0}, // -
|
|
|
+ {GPIOE, GPIO_PINS_5, 0, 0, 0, false, 0, 0}, // TMR9_CH1 (remap)
|
|
|
+ {GPIOC, GPIO_PINS_2, 0, 0, 0, false, 0, 0} // -
|
|
|
};
|
|
|
|
|
|
|
|
@@ -54,6 +54,45 @@ void out_gpio_init(out_t *out, uint8_t index)
|
|
|
do_update(out, index) ;
|
|
|
}
|
|
|
|
|
|
+//
|
|
|
+void do_set_common(void)
|
|
|
+{
|
|
|
+ bool flag = false;
|
|
|
+
|
|
|
+ for (int i = 0; i < DO_NUMBER; i++)
|
|
|
+ {
|
|
|
+ //
|
|
|
+ if ((settings.do_bits & (1 << i)) != (output_state_bit & (1 << i))) {
|
|
|
+ settings.do_bits = output_state_bit;
|
|
|
+ flag = true;
|
|
|
+ }
|
|
|
+ else if ((settings.do_mode_bits & (1 << i)) != (output_mode_bit & (1 << i))) {
|
|
|
+ settings.do_mode_bits ^= (1 << i);
|
|
|
+ settings.do_mode_bits = output_mode_bit;
|
|
|
+ flag = true;
|
|
|
+ }
|
|
|
+ else if (settings.do_pwm[i] != output_pwm[i]) {
|
|
|
+ settings.do_pwm[i] = output_pwm[i];
|
|
|
+ flag = true;
|
|
|
+ }
|
|
|
+ else if (settings.do_pwm_save[i] != output_pwm_save[i]) {
|
|
|
+ settings.do_pwm_save[i] = output_pwm_save[i];
|
|
|
+ flag = true;
|
|
|
+ }
|
|
|
+ else if (settings.do_pwm_period [i] != output_pwm_period[i]) {
|
|
|
+ settings.do_pwm_period[i] = output_pwm_period[i];
|
|
|
+ flag = true;
|
|
|
+ }
|
|
|
+ else if (settings.do_pwm_period_save[i] != output_pwm_period_save[i]) {
|
|
|
+ settings.do_pwm_period_save[i] = output_pwm_period_save[i];
|
|
|
+ flag = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (flag)
|
|
|
+ do_update(&outputs[i], i);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
//
|
|
|
void do_set(void)
|
|
|
{
|
|
@@ -74,31 +113,24 @@ void do_set(void)
|
|
|
}
|
|
|
|
|
|
// Установка значения на выходе
|
|
|
-void do_update(out_t *out, uint8_t index)
|
|
|
+void do_update(out_t *out, uint8_t i)
|
|
|
{
|
|
|
// Режим ШИМ
|
|
|
- if (settings.do_mode_bits & (1 << index))
|
|
|
- {
|
|
|
+ if (settings.do_mode_bits & (1 << i)) {
|
|
|
// Безопасный режим включен
|
|
|
- if (get_save_mode()) {
|
|
|
- do_set_pwm(settings.do_pwm_save[index], index);
|
|
|
- }
|
|
|
- else {
|
|
|
- do_set_pwm(settings.do_pwm[index], index);
|
|
|
- }
|
|
|
+ if (get_save_mode())
|
|
|
+ do_set_pwm(settings.do_pwm_period_save[i], settings.do_pwm_save[i], i);
|
|
|
+ else
|
|
|
+ do_set_pwm(settings.do_pwm_period[i], settings.do_pwm[i], i);
|
|
|
}
|
|
|
// Режим обычного выхода
|
|
|
- else
|
|
|
- {
|
|
|
+ else {
|
|
|
out->mode = 0;
|
|
|
-
|
|
|
// Безопасный режим включен
|
|
|
- if (get_save_mode()) {
|
|
|
- do_set_out(out, settings.do_save_bits & (1 << index));
|
|
|
- }
|
|
|
- else {
|
|
|
- do_set_out(out, settings.do_bits & (1 << index));
|
|
|
- }
|
|
|
+ if (get_save_mode())
|
|
|
+ do_set_out(out, settings.do_save_bits & (1 << i));
|
|
|
+ else
|
|
|
+ do_set_out(out, settings.do_bits & (1 << i));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -123,16 +155,21 @@ void do_set_mode(void)
|
|
|
|
|
|
//#define PWM_PERIOD_TEST 20
|
|
|
//#define PWM_DUTY_TEST 10
|
|
|
-void do_set_pwm(uint16_t pwm, uint8_t index)
|
|
|
+void do_set_pwm(uint16_t period, uint16_t duty, uint8_t index)
|
|
|
{
|
|
|
- //outputs[index].pwm_duty_cnt = (uint16_t)(outputs[index].pwm_period_cnt*pwm/100.0);
|
|
|
- //outputs[index].pwm_duty_cnt = (uint16_t)(PWM_PERIOD_TEST*pwm/100.0);
|
|
|
+ uint16_t duty_calc;
|
|
|
|
|
|
+ if (duty == 0)
|
|
|
+ duty_calc = 0;
|
|
|
+ else
|
|
|
+ duty_calc = (duty*period/100 < 1) ? 1 : duty*period/100;
|
|
|
+
|
|
|
outputs[index].pwm_flag = false;
|
|
|
outputs[index].pwm_period_cnt = 0;
|
|
|
outputs[index].pwm_duty_cnt = 0;
|
|
|
+ outputs[index].pwm_period = period;
|
|
|
+ outputs[index].pwm_duty = duty_calc;
|
|
|
outputs[index].mode = 1;
|
|
|
-
|
|
|
}
|
|
|
|
|
|
//
|
|
@@ -226,16 +263,18 @@ inline void pwm_proc(void)
|
|
|
{
|
|
|
if (outputs[i].mode) // режим PWM
|
|
|
{
|
|
|
- if (outputs[i].pwm_period_cnt == PWM_PERIOD_TEST) {
|
|
|
+ if (outputs[i].pwm_period_cnt == outputs[i].pwm_period /*PWM_PERIOD_TEST*/) {
|
|
|
outputs[i].pwm_period_cnt = 0;
|
|
|
}
|
|
|
if (outputs[i].pwm_period_cnt == 0) {
|
|
|
outputs[i].pwm_flag = false;
|
|
|
- gpio_bits_set(GPIOB, GPIO_PINS_15);
|
|
|
+ gpio_bits_set(outputs[i].port, outputs[i].pin);
|
|
|
+ //gpio_bits_set(GPIOB, GPIO_PINS_15);
|
|
|
}
|
|
|
- if (outputs[i].pwm_duty_cnt == PWM_DUTY_TEST) {
|
|
|
+ if (outputs[i].pwm_duty_cnt == outputs[i].pwm_duty /*PWM_DUTY_TEST*/) {
|
|
|
outputs[i].pwm_duty_cnt = 0;
|
|
|
- gpio_bits_reset(GPIOB, GPIO_PINS_15);
|
|
|
+ gpio_bits_reset(outputs[i].port, outputs[i].pin);
|
|
|
+ //gpio_bits_reset(GPIOB, GPIO_PINS_15);
|
|
|
outputs[i].pwm_flag = true;
|
|
|
}
|
|
|
outputs[i].pwm_period_cnt++;
|