123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- #include "pwm.h"
- #include "gpio.h"
- #include "gpio.h"
- #include "log.h"
- #include "pwm_light.h"
- const uint8_t max_pwm_light = 5;
- uint8_t pwm_light_len = 0;
- // 申请5个通道的内存
- pwm_t pwm_light_chann_list[max_pwm_light] = {
- {PWM_CH0, GPIO_DUMMY, 0, 100, 5, PWM_CLK_DIV_16},
- {PWM_CH1, GPIO_DUMMY, 0, 100, 5, PWM_CLK_DIV_16},
- {PWM_CH2, GPIO_DUMMY, 0, 100, 5, PWM_CLK_DIV_16},
- {PWM_CH3, GPIO_DUMMY, 0, 100, 5, PWM_CLK_DIV_16},
- {PWM_CH5, GPIO_DUMMY, 0, 100, 5, PWM_CLK_DIV_16},
- };
- // 刷新指定 pwm 引脚
- int pwm_light_reflash(int i)
- {
- // 获取 pwm
- pwm_t *pwm = &pwm_light_chann_list[i];
- // 判断 pwm 通道是否已经初始化;
- if(pwm->pin == GPIO_DUMMY){
- return -1;
- }
- LOG("pwm ch%d is reflash \n", i);
-
- hal_pwm_close_channel(pwm->pwm_ch);
- hal_pwm_destroy(pwm->pwm_ch);
- hal_pwm_stop();
- hal_gpio_pin_init(pwm->pin, IE);
- hal_gpio_pull_set(pwm->pin, WEAK_PULL_UP);
- hal_pwm_init(pwm->pwm_ch, pwm->div, PWM_CNT_UP, PWM_POLARITY_FALLING);
- hal_pwm_set_count_val(pwm->pwm_ch, pwm->val, pwm->total);
- hal_pwm_open_channel(pwm->pwm_ch, pwm->pin);
- hal_pwm_start();
- return 0;
- }
- void pwm_reflash_all(){
- // 遍历 pwm_light_chann_list
- for (int i = 0; i < max_pwm_light; i++)
- {
- pwm_light_reflash(i)
- }
- }
- int pwm_change_val(int i){
- // 获取 pwm
- pwm_t *pwm = &pwm_light_chann_list[i];
- // 判断 pwm 通道是否已经初始化;
- if(pwm->pin == GPIO_DUMMY){
- return -1;
- }
- // pwm值保护
- if(pwm->val > pwm->total){
- pwm->val = pwm->total;
- }
- if(pwm->val < 0){
- pwm->val = 0;
- }
- LOG("pwm ch%d is change val \n", i);
- hal_pwm_set_count_val(pwm->pwm_ch, pwm->val, pwm->total);
- return 0;
- }
- // 获取 pwm
- pwm_t *pwm_light_get(uint8_t ch)
- {
- // 判断 ch 是否合法
- if (ch < 0 || ch > max_pwm_light)
- {
- ch = 0;
- }
- // 获取 pwm
- pwm_t *pwm = &pwm_light_chann_list[ch];
- return pwm;
- }
- // 初始化 pwm
- int pwm_light_init(uint8_t ch, GPIO_Pin_e pin, int val, uint8_t total, uint8_t step, PWM_CLK_DIV_e div)
- {
- pwm_t *pwm;
- // 判断 ch 是否合法
- CHECK_PWM_CH
- // 判断 pin 是否合法
- CHECK_PWM_PIN
- // 获取 pwm
- pwm = &pwm_light_chann_list[ch];
- if(val > total){
- val = total;
- }
- // 设置 pwm
- pwm->pin = pin;
- pwm->val = val;
- pwm->total = total;
- pwm->step = step;
- pwm->div = div;
- // 刷新 pwm 引脚
- pwm_reflash_all();
- return 0;
- }
- int pwm_light_set_total(uint8_t ch, int total )
- {
- pwm_t *pwm;
- // 判断 ch 是否合法
- CHECK_PWM_CH
- // 获取 pwm
- pwm = &pwm_light_chann_list[ch];
- pwm->total = total;
- pwm_light_reflash(ch);
- }
- int pwm_light_set_pin(uint8_t ch, GPIO_Pin_e pin)
- {
- pwm_t *pwm;
- // 判断 ch 是否合法
- CHECK_PWM_CH
- // 判断 pin 是否合法
- CHECK_PWM_PIN
- // 获取 pwm
- pwm = &pwm_light_chann_list[ch];
- // 设置 pwm
- pwm->pin = pin;
- // 刷新 pwm 引脚
- pwm_light_reflash(ch);
- return 0;
- }
- int pwm_light_set_val(uint8_t ch , uint8_t val)
- {
- pwm_t *pwm;
- // 判断 ch 是否合法
- CHECK_PWM_CH
- // 获取 pwm
- pwm = &pwm_light_chann_list[ch];
- if(val > pwm->total){
- val = pwm->total;
- }
- LOG("light val %d --->> %d \n", pwm->val, val);
- // 设置 pwm
- pwm->val = val;
-
- // 设置 pwm 引脚值
- pwm_change_val(ch);
- return 0;
- }
- int pwm_light_set_div(uint8_t ch, PWM_CLK_DIV_e div)
- {
- pwm_t *pwm;
- // 判断 ch 是否合法
- CHECK_PWM_CH
- // 判断 div 是否合法
- if (div < PWM_CLK_DIV_2 || div > PWM_CLK_DIV_128)
- {
- return -2;
- }
- // 获取 pwm
- pwm = &pwm_light_chann_list[ch];
- // 设置 pwm
- pwm->div = div;
- // 刷新 pwm 引脚
- pwm_light_reflash(ch);
- return 0;
- }
|