- 打卡等级:以坛为家II
- 打卡总天数:517
- 最近打卡:2025-08-10 01:30:57
高级会员
- 积分
- 571
|
发表于 2025-7-9 13:12:57
|
显示全部楼层
代码移植部分,仅供参考;有更好的实现方法和更多的功能请无私赐教,谢谢
因为AI8H2K12U-45I-SOP8只有8个引脚,资源比较紧张,pwm6在1号引脚,要设置成p5.4,二楼大佬的建议很好,本人软硬件均刚入门,奢望大佬们给出具体方案,竭尽全力榨干8H2K12U-SOP8芯片价值,发挥最大功效,弃用国外的芯片的目的
main.h文件
#ifndef _MAIN_H
#define _MAIN_H
#define MAIN_Fosc 24000000L //������ʱ��
#endif
main.c文件
#include "main.h"
#include "STC8H2K12U.h"
#include "PWM.H"
void main(void)
{
P3M0 |= (0x03); //P3.0,P3.1准双向口
P3M1 &= ~(0x03);
P3M1 |= (0x0C); //P3.2,P3.3高阻
P3M0 &= ~(0x0C);
P5M1 &= ~0x10; //P5.4准双向口
P5M0 |= 0x10;
PWM6_config();
EA =1;
P32=1;
while (1)
{
}
}
pwm.h文件
#ifndef _PWM_H
#define _PWM_H
void PWM6_config(void);
#endif
pwm.c文件
#include "PWM.H"
#include "STC8H2K12U.h"
void PWM6_config(void)
{
P_SW2 |= 0x80; //使能访问扩展RAM区特殊功能寄存器SFR
PWMB_CCER1 &= ~0x10; //写CCMR2前关闭CC6E通道
PWMB_CCMR2 &= ~0x03; //CC6S输出
PWMB_CCMR2 &= ~0x70; //OC6M[2:0]3位置0;
PWMB_CCMR2 |= 0x60; //PWM模式1输出:110
PWMB_CCER1 |= 0x10; // 开启比较输出, 高电平有效
PWMB_ENO |= 0x04; // 使能输出
PWMB_CCR6 = 2000; // 比较值, 控制占空比(高电平时钟数)
PWMB_PS |= 0x04; // 选择IO,00:选择P2.1,01:选择P5.4,10:选择P0.1,11:选择P7.5
PWMB_PSCR = 5; // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
PWMB_DTR = 24; // 死区时间配置, n=0~127: DTR= n T, 0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,
// 0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T, 0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
PWMB_ARRH = 0x0F; // 自动重装载寄存器, 控制PWM周期
PWMB_ARRL = 0x9F;
PWMB_CCMR2 |= 0x08; // 通道模式配置, PWM模式1, 预装载允许
PWMB_BKR = 0x80; // 主输出使能 相当于总开关
PWMB_CR1 = 0x81; // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数, bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
PWMB_EGR = 0x01; //产生一次更新事件, 清除计数器和与分频计数器, 装载预分频寄存器的值
// PWMA_ISR_En = PWMA_IER; //设置标志允许通道1~4中断处理
} |
|