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電阻的電壓和溫度的關系,進而得出電壓。

發布
問題