亚洲春色中文字幕久久久-三上亚,91精品国产亚一区二区三区,久久久九色综合亚洲成色777,涩涩视频下载,国产午夜亚洲精品午夜鲁丝片,国产精品A一区二区三区腾讯导航,影音先锋色情AV在线看片,蜜臀国产在线视频,极品少妇高潮啪啪无码吴梦梦 ,精品人妻无码一区二区三区手机版

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1233|回復: 1
打印 上一主題 下一主題
收起左側

初學者使用PY32F002B如何用PWM控制WS2812B燈珠,求大佬幫忙

[復制鏈接]
跳轉到指定樓層
樓主
ID:904694 發表于 2025-9-8 10:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近用普冉的PY32F002B,采用PWM中斷的方式驅動WS2812B燈珠,先發送了一個0x55,用邏輯分析儀查看波形,發現波形不對,應顯示01010101,波形顯示卻是7個0碼,8個1碼,8個0碼,8個1碼,8個0碼,8個1碼,8個0碼,7個1碼,糾結了幾天未找到解決方法,故來此地向各位大佬求助。
/******************/
int main(void)
{
    // 系統時鐘初始化
    HAL_Init();
    SystemClockConfig();
   PWM_Interrupt_Init();
   SendByte(0x55);   
while (1)
    {   
    }
}

/********************/
static volatile uint8_t current_bit_to_send = 0;
static volatile uint8_t byte_to_send = 0;
static volatile uint8_t bit_index = 0;


TIM_HandleTypeDef    TimHandle;
TIM_OC_InitTypeDef   sConfig;
RGB_Color leds[LED_COUNT];

void PWM_Interrupt_Init(void)
{
    TimHandle.Instance = TIM1;                                                      /* TIM1 */
    TimHandle.Init.Period            = TOTAL_TIME - 1;                                      /* Period = 30 - 1 */
    TimHandle.Init.Prescaler         = 1 - 1;                                       /* Prescaler = 0 */
    TimHandle.Init.ClockDivision     = TIM_CLOCKDIVISION_DIV1;                      /* ClockDivision = 0 */
    TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;                          /* Counter direction = Up */
    TimHandle.Init.RepetitionCounter = 1 - 1;                                       /* Repetition = 0 */
    TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;              /* Auto-reload register not buffered */
    if (HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)                                    /* Initialize TIM1 */
    {
        Error_Handler();
    }               

    sConfig.OCMode       = TIM_OCMODE_PWM1;            /* Set output compare mode: PWM1 */                        
    sConfig.OCPolarity   = TIM_OCPOLARITY_HIGH;        /* OC channel output high level effective */                                
    sConfig.OCFastMode   = TIM_OCFAST_DISABLE;         /* Disable OC FastMode */      
    sConfig.OCNPolarity  = TIM_OCNPOLARITY_HIGH;                   /* OCN channel output high level effective */
    sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;                 /* Idle state OC1N output low level */
    sConfig.OCIdleState  = TIM_OCIDLESTATE_RESET;           /* Idle state OC1 output low level*/
    sConfig.Pulse = 0;  
    if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)
    {
        Error_Handler();
    }   

}

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
    GPIO_InitTypeDef   GPIO_InitStruct = {0};

    //使能時鐘
    __HAL_RCC_TIM1_CLK_ENABLE();                           
    __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;                  
    GPIO_InitStruct.Pull = GPIO_PULLUP;                       
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    HAL_NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 0, 0);       //最高優先級   
    HAL_NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);                          
}


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
        if (htim->Instance == TIM1)
        {
    bit_index++;
    if(bit_index < 8)
    {
        current_bit_to_send = (byte_to_send << bit_index) & 0x80;
        SendBit(current_bit_to_send);
    }
    else
    {
        // 停止PWM輸出并禁用中斷
                                        HAL_TIM_PWM_Stop(&TimHandle, TIM_CHANNEL_1);
                                        __HAL_TIM_DISABLE_IT(&TimHandle, TIM_IT_UPDATE);     
    }
        }
}

// 發送一位數據
void SendBit(uint8_t bit)
{       
    if (bit)
    {
        // 發送1碼:高電平0.9us,低電平0.35us                       
        __HAL_TIM_SET_COMPARE(&TimHandle, TIM_CHANNEL_1, 22);         
    }
    else
    {               
        // 發送0碼:高電平0.35us,低電平0.9us
        __HAL_TIM_SET_COMPARE(&TimHandle, TIM_CHANNEL_1, 8);       

    }

}
// 發送一個字節數據(8位)
void SendByte(uint8_t byte)
{
    byte_to_send = byte;
    bit_index = 0;
       
    current_bit_to_send = (byte_to_send << bit_index) & 0x80;
       
    HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1);
          SendBit(current_bit_to_send);
        __HAL_TIM_ENABLE_IT(&TimHandle, TIM_IT_UPDATE);
}
/**********************/

主要程序附上,請問如何解決
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:285258 發表于 2025-10-21 11:09 | 只看該作者
實測過沒有DMA的芯片驅動幻彩燈不管是用PWM還是用SPI都不如直接程序IO模擬時序效果好。包括PY32F002B也驗證過
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表