STC8——PWM介绍及使用

1、相关寄存器

  • 增强型 PWM 控制寄存器(切换引脚功能)

在这里插入图片描述

  • 控制寄存器
    在这里插入图片描述

  • PWM 时钟选择寄存器
    在这里插入图片描述

  • PWM 翻转点设置计数值寄存器
    在这里插入图片描述
    在这里插入图片描述

  • PWM 计数值寄存器
    在这里插入图片描述

  • PWM 通道控制寄存器
    在这里插入图片描述

2、编写流程

  • 配置GPIO工作模式(推挽输出)
  • 切换PWM引脚
  • 设置时钟、周期
  • 设置低电平翻转值
  • 使能PWM输出
  • 启动PWM
#define PWMx_CR_BASE_ADDR 0xff04
#define PWMx_T1_BASE_ADDR 0xff00
#define PWMx_T2_BASE_ADDR 0xff02
	uint16 match_temp;
	uint16 period_temp; 
	uint8 freq_div = 0;
	
	pwm_set_gpio(pwmch);					//设置为推挽输出

	
	//清除PWM引脚
	(*(unsigned char volatile xdata *)(PWMx_CR_BASE_ADDR + (pwmch & 0xF0))) &= ~(0x03 << 3);
	//切换PWM引脚
	(*(unsigned char volatile xdata *)(PWMx_CR_BASE_ADDR + (pwmch & 0xF0))) |= (pwmch & 0x03) << 3;
	
	freq_div = (sys_clk / freq) >> 15;
	period_temp = sys_clk / freq / (freq_div + 1);				//周期
	match_temp = period_temp * ((float) duty / PWM_DUTY_MAX);	//占空比

	//设置pwmn频率为 系统时钟/freq_div
	PWMCKS = freq_div;
	//设置PWMn周期为period_temp个 PWM 时钟
	PWMC = (uint16)period_temp; 	

	// 在计数值为 match_temp 地方 pwmch 通道输出低电平
	(*(unsigned int  volatile xdata *)(PWMx_T1_BASE_ADDR + (pwmch & 0xF0))) = (uint16)match_temp;
//	// 在计数值为 match_temp 地方 pwmch 通道输出高电平
//	(*(unsigned int  volatile xdata *)(PWMx_T2_BASE_ADDR + (pwmch & 0xF0))) = (uint16)0;


	//使能 PWMx 输出
	(*(unsigned char volatile xdata *)(PWMx_CR_BASE_ADDR + (pwmch & 0xF0))) |= 1 << 7;

	PWMCR = 0x80; // 启动 PWM 模块
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
STC8H3系列单片机具有PWM(脉冲宽度调制)功能,可以用来生成具有不同占空比的脉冲信号。下面是一个简单的示例代码,用于在STC8H3单片机上配置和使用PWM功能: ```c #include <stc8.h> // 配置PWM参数 void PWM_Init() { P_SW1 |= 0x10; // 将PWM输出引脚设置为P1.7 PWM_CLOCK_DIV_1(); // 设置PWM时钟分频系数为1 PWM0_CTR = 0x00; // PWM0工作在8位自动重装模式 PWM0_PCR = 0x02; // PWM0占空比可调模式 PWM0_PERH = 0xFF; // 设置PWM0的周期高位 PWM0_PERL = 0xFF; // 设置PWM0的周期低位 PWM0_DCH = 0x00; // 设置PWM0的占空比高位 PWM0_DCL = 0x00; // 设置PWM0的占空比低位 PWM0_CTRL |= 0x80; // 启动PWM0 } // 调节PWM占空比 void PWM_SetDutyCycle(unsigned int dutyCycle) { unsigned int pwmValue = (dutyCycle * 1023) / 100; PWM0_DCH = pwmValue >> 2; // 设置PWM0的占空比高位 PWM0_DCL = (pwmValue & 0x03) << 6; // 设置PWM0的占空比低位 } // 主函数 void main() { PWM_Init(); // 初始化PWM // 调节PWM占空比 PWM_SetDutyCycle(50); // 设置占空比为50% while (1); // 程序主循环 } ``` 在上述代码中,我们通过PWM_Init函数配置了PWM参数,包括设置PWM时钟分频系数、工作模式、周期和初始占空比等。然后,我们通过PWM_SetDutyCycle函数调节PWM的占空比,可以根据需要传入不同的dutyCycle值来实现不同的占空比设置。最后,在主函数中我们初始化PWM并设置占空比为50%。 请注意,上述代码仅供参考,具体的实现方式可能会因为不同的开发环境和芯片配置而略有差异。你需要根据自己的实际情况进行相应的调整和修改。同时,具体的PWM配置和使用方法还可以参考STC8H3的官方文档或者相关的编程教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dz小伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值