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);
}
上面的程序头文件 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
使能PWMxx端口输出放在后面
PWM3N使能是在PWMA_CCER2的bit2
所以应该设置 PWMA_CCER2 = 0x04;
谢谢帮助,已经可以了。看了STC官方程序,有个疑问,
PWM初始化程序为什么没有设置预分频寄存器PWMx_PSCR的值,
频率计算公式中要用预分频寄存器的值。
不设置怎么知道频率呢?
页:
[1]