Mrzhao
Mrzhao - 认证专家
一个嵌入式爱好者. CSDN 主页: https: //blog. csdn. net/qq_37280428? spm=1011. 2415. 3001. 5343

注册于 2 年前

回答
43
文章
7
关注者
7

看 SDK, 里面有硬件 SPI 的, 但是主最多只能干到 20, 从可以用 hspi.
image. png

第一个问题: 我大概看了一下程序, 有通道 4, 你在初始化哪里可以把 if 判断删除掉, cmd 函数中有判断是否为 0 和 4. 我也怀疑是 bug. . . . . @isme 快来解答
image. png

第二个问题: 0 表示持续输出, 我方式就吃了这个亏. , . . . .
image. png
还有一个坑:
image. png
这里当 duty 设置为 0, PWM 就 stop 了, 所以, 要把这几句屏蔽掉, 否者下次使用你还要 start.

第三个问题:
溢出次数.
我看手册发现这个, 你定时去读取这里的数据, 判断是否溢出, 手动清除. 然后多次计数实现? @isme @ZYQ 两位大佬觉得这样可行不? ? ?
image. png

是否设置: hpwm. Init. OutMode = PWM_OUT_MODE_INDEPENDENT; //独立通道输出

异常抛出一般是你内存出问题了, 你看看 你的参数中用的内存有没有越界之类的. 注意 IIC 接收数据的存放问题

有 nop

#include "wm_hal. h"
#include "assert. h"


//160MZH  53 个 nop 就是 1us
//240Mhz  80 个 nop 就是 1us
//可以实现 1ms 以下的延时,  多了的 就不要用了.  不准.  
//5u 以下的延时会存在误差 注意.  
static void Delay_Us (uint8_t freq, uint32_t time) 
{
    uint32_t i; 
    uint16_t num = 90; 
    if (time "  1000) 
    {
        printf ("delay time is too lager than 1000,  please use HAL_Delay () \r\n") ; 
    }
    switch (freq) 
    {
        case 240:  num = 80; break; 
        case 160:  num = 53; break; 
        default:  printf ("delay input freq err. . . default set 240MHZ us time \r\n ") ; break; 
    }
    
    for  (i = 0;  i  "  (num) *time;  i++) 
    {
        __NOP () ; 
    }
}

我来回答第二个问题: 我当时遇到过. 为 0 后 PWM 必须要重新 start, 因此可以这样做:
image. png

PWM 的配置的 IO 是浮空.

这种问题我建议直接判定为灌水@isme

说起智能小灯那就非常棒了: 参考文章 (有完整工程)
https: //blog. csdn. net/qq_37280428/article/details/124109497
流程图:
image. png

5v 分压成 2. 5 R1 和 R2 可以取相同的阻值, 比如 10k 那就是平均分 2. 5v 和 2. 5v.
. . . .
但是如果严格要求 2. 4v 以下那你可以取 3: 2. 及 3k 和 2k

ADC 测量的是电压, 不能只接 NTC, 找了一张图你可以参考:
image. png
这样接你读出来的 adc 电压 = VCC_3V-V (ntc) . 你还需要找到 NTC 电阻的电压和温度的关系, 进而得出电压.

发布
问题