duam 发表于 2024-5-20 17:19:50

STC8H1K08使用PWM输出38K,无波形输出。

我这边只有STC8H1K08的芯片,我想使用p3.3输出38k的波形,做红外发射。
下面是基于示例代码做的修改,p3.3发现无波形输出。
帮忙看看问题在哪里?

/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com-----------------------------------------*/

/* Èç¹ûÒªÔÚ³ÌÐòÖÐʹÓô˴úÂë,ÇëÔÚ³ÌÐòÖÐ×¢Ã÷ʹÓÃÁËSTCµÄ×ÊÁϼ°³ÌÐò      */
/*---------------------------------------------------------------------*/


/*************±¾³ÌÐò¹¦ÄÜ˵Ã÷**************

±¾Àý³Ì»ùÓÚSTC8H8K64UΪÖ÷¿ØÐ¾Æ¬µÄʵÑéÏä8½øÐбàд²âÊÔ£¬STC8HϵÁÐоƬ¿ÉͨÓòο¼.

Óû§¿ÉÒÔÔں궨ÒåÖиıäMCUÖ÷ʱÖÓÆµÂÊ. ·¶Î§ 8MHZ ~ 33MHZ.

ºìÍâ·¢Éä³ÌÐò¡£Ä£ÄâÊг¡ÉÏÓÃÁ¿×î´óµÄNECµÄ±àÂë¡£

Óû§¿ÉÒÔÔں궨ÒåÖÐÖ¸¶¨Óû§Âë.

ʹÓÃPWM4²úÉú38KHZÔØ²¨, 1/3Õ¼¿Õ±È, ÿ¸ö38KHZÖÜÆÚ·¢Éä¹Ü·¢Éä9us,¹Ø±Õ16.3us.

ʹÓÿª·¢°åÉϵÄ16¸öIOɨÃè°´¼ü, MCU²»Ë¯Ãß, Á¬ÐøÉ¨Ãè°´¼ü.

µ±¼ü°´ÏÂ, µÚһ֡ΪÊý¾Ý, ºóÃæµÄÖ¡ÎªÖØ¸´Ö¡,²»´øÊý¾Ý, ¾ßÌ嶨ÒåÇë×ÔÐвο¼NECµÄ±àÂë×ÊÁÏ.

¼üÊͷźó, Í£Ö¹·¢ËÍ.

ÏÂÔØÊ±, Ñ¡ÔñʱÖÓ 24MHZ (Óû§¿É×ÔÐÐÐÞ¸ÄÆµÂÊ).

******************************************/

#include "stc8h.h"       //°üº¬´ËÍ·Îļþºó£¬²»ÐèÒªÔÙ°üº¬"reg51.h"Í·Îļþ
#include "intrins.h"

#define   MAIN_Fosc       24000000UL//¶¨ÒåÖ÷ʱÖÓ

typedef   unsigned char   u8;
typedef   unsigned int    u16;
typedef   unsigned long   u32;

/*************ºìÍâ·¢ËÍÏà¹Ø±äÁ¿    **************/
#define User_code   0xFF00      //¶¨ÒåºìÍâÓû§Âë

sbit    P_IR_TX   = P3^3;   //¶¨ÒåºìÍâ·¢ËͶ˿Ú
#define IR_TX_ON    0
#define IR_TX_OFF   1

u16   tx_cnt;   //·¢ËÍ»ò¿ÕÏеÄÂö³å¼ÆÊý(µÈÓÚ38KHZµÄÂö³åÊý£¬¶ÔӦʱ¼ä), ºìÍâÆµÂÊΪ38KHZ, ÖÜÆÚ26.3us
u8      TxTime;   //·¢ËÍʱ¼ä

u16   send_time_num = 0;

u8KeyHoldCnt; //¼ü°´Ï¼ÆÊ±
u8KeyCode;    //¸øÓû§Ê¹ÓõļüÂë, 1~16ÓÐЧ

/*************±¾µØº¯ÊýÉùÃ÷    **************/
void    delay_ms(u8 ms);
void    PWM_config(void);
void    IR_TxPulse(u16 pulse);
void    IR_TxSpace(u16 pulse);
void    IR_TxByte(u8 dat);

/********************** Ö÷º¯Êý ************************/
void main(void)
{
    P_SW2 |= 0x80;//À©Õ¹¼Ä´æÆ÷(XFR)·ÃÎÊʹÄÜ
#if 0
    P1M1 = 0x30;   P1M0 = 0x30;   //ÉèÖÃP1.4¡¢P1.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P2M1 = 0x3c;   P2M0 = 0x3c;   //ÉèÖÃP2.2~P2.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P3M1 = 0x50;   P3M0 = 0x50;   //ÉèÖÃP3.4¡¢P3.6Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P4M1 = 0x3c;   P4M0 = 0x3c;   //ÉèÖÃP4.2~P4.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P5M1 = 0x0c;   P5M0 = 0x0c;   //ÉèÖÃP5.2¡¢P5.3Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P6M1 = 0xff;   P6M0 = 0xff;   //ÉèÖÃΪ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P7M1 = 0x00;   P7M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
#endif
      
    PWM_config();
    P_IR_TX = IR_TX_OFF;

    EA = 1;                     //´ò¿ª×ÜÖжÏ

    while(1)
    {
      delay_ms(60);       //30ms
                              send_time_num++;
                        
      if(send_time_num == 200)      //¼ì²âµ½¼üÂë
      {
                                                send_time_num = 0;
            TxTime = 0;
                              //Ò»Ö¡Êý¾Ý×îС³¤¶È = 9 + 4.5 + 0.5625 + 24 * 1.125 + 8 * 2.25 = 59.0625 ms
                              //Ò»Ö¡Êý¾Ý×î´ó³¤¶È = 9 + 4.5 + 0.5625 + 8 * 1.125 + 24 * 2.25 = 77.0625 ms
            IR_TxPulse(342);    //¶ÔÓ¦9ms£¬Í¬²½Í·       9ms
            IR_TxSpace(171);    //¶ÔÓ¦4.5ms£¬Í¬²½Í·¼ä¸ô 4.5ms
            IR_TxPulse(21);   //¿ªÊ¼·¢ËÍÊý¾Ý          0.5625ms

            IR_TxByte(User_code%256);   //·¢Óû§ÂëµÍ×Ö½Ú
            IR_TxByte(User_code/256);   //·¢Óû§Âë¸ß×Ö½Ú
            IR_TxByte(KeyCode);         //·¢Êý¾Ý
            IR_TxByte(~KeyCode);      //·¢Êý¾Ý·´Âë

            if(TxTime < 56)   //Ò»Ö¡°´×î´ó77ms·¢ËÍ, ²»¹»µÄ»°,²¹³¥Ê±¼ä   108ms
            {
                TxTime = 56 - TxTime;
                TxTime = TxTime + TxTime / 8;
                delay_ms(TxTime);
            }
            delay_ms(31);
      }
    }
}
/**********************************************/

//========================================================================
// º¯Êý: void delay_ms(u8 ms)
// ÃèÊö: ÑÓʱº¯Êý¡£
// ²ÎÊý: ms,ÒªÑÓʱµÄmsÊý, ÕâÀïÖ»Ö§³Ö1~255ms. ×Ô¶¯ÊÊÓ¦Ö÷ʱÖÓ.
// ·µ»Ø: none.
// °æ±¾: VER1.0
// ÈÕÆÚ: 2021-3-9
// ±¸×¢:
//========================================================================
void delay_ms(u8 ms)
{
   u16 i;
   do{
          i = MAIN_Fosc / 10000;
          while(--i);   //10T per loop
   }while(--ms);
}



/************* ·¢ËÍÂö³åº¯Êý **************/
void IR_TxPulse(u16 pulse)
{
    tx_cnt = pulse;
    PWMA_CCER2 = 0x00; //д CCMRx ǰ±ØÐëÏÈÇåÁã CCxE ¹Ø±ÕͨµÀ
    PWMA_CCMR4 = 0x68; //ÉèÖà PWM4 ģʽ1 Êä³ö
    PWMA_CCER2 = 0x70; //ʹÄÜ CC4NE ͨµÀ, µÍµçƽÓÐЧ
    PWMA_IER = 0x10;   //ʹÄܲ¶»ñ/±È½Ï 4 ÖжÏ
    while(tx_cnt);
}

/************* ·¢ËÍ¿ÕÏк¯Êý **************/
void IR_TxSpace(u16 pulse)
{
    tx_cnt = pulse;
    PWMA_CCER2 = 0x00; //д CCMRx ǰ±ØÐëÏÈÇåÁã CCxE ¹Ø±ÕͨµÀ
    PWMA_CCMR4 = 0x40; //ÉèÖà PWM4 Ç¿ÖÆÎªÎÞЧµçƽ
    PWMA_CCER2 = 0x70; //ʹÄÜ CC4NE ͨµÀ, µÍµçƽÓÐЧ
    PWMA_IER = 0x10;   //ʹÄܲ¶»ñ/±È½Ï 4 ÖжÏ
    while(tx_cnt);
}


/************* ·¢ËÍÒ»¸ö×Ö½Úº¯Êý **************/
void IR_TxByte(u8 dat)
{
    u8 i;
    for(i=0; i<8; i++)
    {
      if(dat & 1)   IR_TxSpace(63), TxTime += 2;    //Êý¾Ý1¶ÔÓ¦ 1.6875 + 0.5625 ms
      else            IR_TxSpace(21), TxTime++;       //Êý¾Ý0¶ÔÓ¦ 0.5625 + 0.5625 ms
      IR_TxPulse(21);         //Âö³å¶¼ÊÇ0.5625ms
      dat >>= 1;            //ÏÂÒ»¸öλ
    }
}

//========================================================================
// º¯Êý: void PWM_config(void)
// ÃèÊö: PCAÅäÖú¯Êý.
// ²ÎÊý: None
// ·µ»Ø: none.
// °æ±¾: V1.0, 2012-11-22
//========================================================================
void PWM_config(void)
{
    PWMA_CCER2 = 0x00; //д CCMRx ǰ±ØÐëÏÈÇåÁã CCxE ¹Ø±ÕͨµÀ
    PWMA_CCMR4 = 0x68; //ÉèÖà PWM4 ģʽ1 Êä³ö
    //PWMA_CCER2 = 0xB0; //ʹÄÜ CC4E ͨµÀ, µÍµçƽÓÐЧ

    PWMA_ARRH = 0x02; //ÉèÖÃÖÜÆÚʱ¼ä
    PWMA_ARRL = 0x77;
    PWMA_CCR4H = 0;
    PWMA_CCR4L = 210; //ÉèÖÃÕ¼¿Õ±Èʱ¼ä

    PWMA_PS = 0x40;//¸ß¼¶ PWM ͨµÀ 4N Êä³ö½ÅÑ¡Ôñλ, 0x00:P1.7, 0x40:P2.7, 0x80:P6.7, 0xC0:P3.3
//PWMA_PS = 0x40;//¸ß¼¶ PWM ͨµÀ 4P Êä³ö½ÅÑ¡Ôñλ, 0x00:P1.6, 0x40:P2.6, 0x80:P6.6, 0xC0:P3.4
    PWMA_ENO = 0x80; //ʹÄÜ PWM4N Êä³ö
//PWMA_ENO = 0x40; //ʹÄÜ PWM4P Êä³ö
    PWMA_BKR = 0x80; //ʹÄÜÖ÷Êä³ö
//    PWMA_IER = 0x10; // ʹÄÜÖжÏ
    PWMA_CR1 |= 0x01; //¿ªÊ¼¼ÆÊ±
}

/******************* PWMÖжϺ¯Êý ********************/
void PWMA_ISR() interrupt 26
{
    if(PWMA_SR1 & 0X10)
    {
      //PWMA_SR1 &=~0X10;
      PWMA_SR1 = 0;
                        
      if(--tx_cnt == 0)
      {
            PWMA_CCER2 = 0x00; //д CCMRx ǰ±ØÐëÏÈÇåÁã CCxE ¹Ø±ÕͨµÀ
            PWMA_CCMR4 = 0x40; //ÉèÖà PWM4 Ç¿ÖÆÎªÎÞЧµçƽ
            PWMA_CCER2 = 0x70; //ʹÄÜ CC4NE ͨµÀ, µÍµçƽÓÐЧ
            PWMA_IER = 0x00;   // ¹Ø±ÕÖжÏ
      }
    }
}


神农鼎 发表于 2024-5-20 17:24:29



管脚图






神农鼎 发表于 2024-5-20 17:28:24



https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=6704&pid=58171

梁工 发表于 2024-5-20 17:28:42

请先测试STC官方例程,确认PWM输出正常,再移植修改。红外遥控是简单代码,很容易实现的。

duam 发表于 2024-5-20 17:43:48

官方例程是基于STC8H8K64U芯片的,我这边没有这颗芯片。我这边只有STC8H1K08的芯片,所以要移植了验证。

乘风飞扬 发表于 2024-5-20 18:50:51

既然使用P33输出PWM,那么PWM4N通道切换就要设置到P33

页: [1]
查看完整版本: STC8H1K08使用PWM输出38K,无波形输出。