DGWJL2024 发表于 2024-9-3 09:04:36

AI8H4K32TL的PWM3N发不出PWM波形

本帖最后由 DebugLab 于 2024-9-3 09:19 编辑

用AI8H4K32TL的PWM3N发不出PWM波形 (P2.5口) 程序如下,请大家看看那里不对

#include "STC8H.h"
#include "pwm.h"
void led_pwm_init(void)
{
                P_SW2 |= 0x80;      

      
                PWMA_PSCR = 23;               //预分频 24MZ/(23+1) = 1MHz
      
    PWMA_ENO= 0x00;
    PWMA_ENO |= ENO3N; //使能输出PWM3N                        
      
    PWMA_CCER2 = 0x00; //写CCMRx前必须先清零CCERx关闭通道                     
    PWMA_CCMR3 = 0x68; //PWM1 模式1输出 开启预装载功能
    PWMA_CCER2 = 0x01; //高电平有效 开启捕获比较输出使能CC3通道
//PWMA_CCER1 = 0x03; //低电平有效                        
      
    PWMA_PS= 0x00;   //功能脚切换                     
    PWMA_PS |= PWM3_2; //P:P2.4N:P2.5                     

                PWMA_ARR= 2000;
    PWMA_CCR3 = 1000;            
      
          PWMA_BKR= 0x80;//使能主输出                     
    PWMA_CR1 |= 0x01;//使能定时器工作                  
}

//void led_pwm_init(void)
//{
//                P_SW2 |= 0x80;      

//                P1M0 &= 0xFE;
//          P1M1 &= 0xFE;
//      
//                PWMA_PSCR = 23;                //预分频 24MZ/(23+1) = 1MHz
//      
//    PWMA_ENO= 0x00;
//    PWMA_ENO |= ENO1P;//使能输出                        
//      
//    PWMA_CCER1 = 0x00;                        
//    PWMA_CCMR1 = 0x68;//PWM1 模式1输出
//    PWMA_CCER1 = 0x01;//高电平有效
////PWMA_CCER1 = 0x03;//低电平有效                        
//      
//    PWMA_PS= 0x00;                        
//    PWMA_PS |= PWM1_1;                     
//
//                PWMA_ARR= LED_DEFAULT_PWM_CYC;
//    PWMA_CCR1 = 1000;            
//      
//          PWMA_BKR= 0x80;                        
//    PWMA_CR1 |= 0x01;                     
//}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

//    P_SW2 = 0x80;
//    PWMA_CCER1 = 0x00;                        //写CCMRx前必须先清零CCERx关闭通道
//    PWMA_CCMR1 = 0x60;                        //设置CC1为PWMA输出模式PWM模式1
//    PWMA_CCER1 = 0x01;                        //使能CC1通道
//    PWMA_CCR1 = 100;                            //设置占空比时间
//    PWMA_ARR = 500;                           //设置周期时间
//    PWMA_ENO = 0x01;                            //使能PWM1P端口输出
//    PWMA_BKR = 0x80;                            //使能主输出
//    PWMA_CR1 = 0x01;                            //开始计时
    led_pwm_init();

    while (1);
}



DGWJL2024 发表于 2024-9-3 09:06:51

上面的程序头文件 PWM.H程序
#ifndef __PWM_H__
#define __PWM_H__

typedef unsigned int uint16_t;

#define   LED_DEFAULT_PWM_CYC                2000
#define   LED_DEFAULT_DUTY_0                  0
#define   BUZZER_DEFAULT_PWM_CYC   500

#define PWM1_1      0x00//P:P1.0N:P1.1
#define PWM1_2      0x01//P:P2.0N:P2.1
#define PWM1_3      0x02//P:P6.0N:P6.1

#define PWM2_1      0x00//P:P1.2N:P1.3<->P:P5.4
#define PWM2_2      0x04//P:P2.2N:P2.3
#define PWM2_3      0x08//P:P6.2N:P6.3

#define PWM3_1      0x00//P:P1.4N:P1.5
#define PWM3_2      0x10//P:P2.4N:P2.5
#define PWM3_3      0x20//P:P6.4N:P6.5

#define PWM4_1      0x00//P:P1.6N:P1.7
#define PWM4_2      0x40//P:P2.6N:P2.7
#define PWM4_3      0x80//P:P6.6N:P6.7
#define PWM4_4      0xC0//P:P3.4N:P3.3

#define ENO1P       0x01
#define ENO1N       0x02
#define ENO2P       0x04
#define ENO2N       0x08
#define ENO3P       0x10
#define ENO3N       0x20
#define ENO4P       0x40
#define ENO4N       0x80


#define PWM5_1                        0x00//P2.0
#define PWM5_2                        0x01//P1.7
#define PWM5_3                        0x02//P0.0
#define PWM5_4                        0x03//P7.4

#define PWM6_1                        0x00//P2.1
#define PWM6_2                        0x04//P5.4
#define PWM6_3                        0x08//P0.1
#define PWM6_4                        0x0C//P7.5

#define PWM7_1                        0x00//P2.2
#define PWM7_2                        0x10//P3.3
#define PWM7_3                        0x20//P0.2
#define PWM7_4                        0x30//P7.6

#define PWM8_1                        0x00//P2.3
#define PWM8_2                        0x40//P3.4
#define PWM8_3                        0x80//P0.3
#define PWM8_4                        0xC0//P7.7

#define ENO5P       0x01
#define ENO6P       0x04
#define ENO7P       0x10
#define ENO8P       0x40

extern void led_pwm_init(void);
extern void buzzer_pwm_init(void);
extern void set_led_pwm_duty(uint16_tduty,uint16_t cyc);
extern void set_buzzer_pwm_duty(uint16_tduty, uint16_t cyc);
#endif

DebugLab 发表于 2024-9-3 09:29:14



使能PWMxx端口输出放在后面


乘风飞扬 发表于 2024-9-3 09:32:48

PWM3N使能是在PWMA_CCER2的bit2
所以应该设置 PWMA_CCER2 = 0x04;

DGWJL2024 发表于 2024-9-5 16:46:34

谢谢帮助,已经可以了。看了STC官方程序,有个疑问,
PWM初始化程序为什么没有设置预分频寄存器PWMx_PSCR的值,
频率计算公式中要用预分频寄存器的值。
不设置怎么知道频率呢?
页: [1]
查看完整版本: AI8H4K32TL的PWM3N发不出PWM波形