用STC15F104W单片机读取PWM信号控制IO口

本文详细介绍了如何使用STC15F104W单片机通过外部中断和定时器读取50Hz PWM信号,以控制IO口。通过分析和优化,避免了不断进入中断处理函数造成的CPU资源浪费,实现了精确的PWM值读取。实验结果显示,这种方法能高效地根据PWM占空比控制IO口状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要介绍怎么通过遥控接收机的信号控制单片机的IO口。试验器材:

天地飞WFT09II 9通道2.4G遥控器+接收机

STC15F104W单片机

这里接收机输出的是频率为50hz,周期为20ms的pwm波形,通过单片机外部中断口接收pwm信号,启用定时器/计数器对pwm高电平的持续时间进行计数。

Arduino中的pulseIn函数可以直截了当地读取pwm的值,可以参考其底层的实现方法,这里有一个链接介绍pulseIn函数读取pwm的思想。

arduino与pulseIn_arduino 非阻塞状态机-CSDN博客

文中关键部分:

unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout) {
  pinMode(pin, INPUT);
  uint32_t start = micros();
  while(digitalRead(pin) == state && (micros() - start) < timeout);
  while(digitalRead(pin) != state &
在C语言中,为了在STC15W204S单片机上通过IO模拟4路PWM(脉宽调制)信号输出,你需要了解该微控制器的特性、GPIO设置以及定时器的使用。以下是一个简化的步骤: 1. **包含头文件**: 首先,包括必要的头文件,如`stc15f2k60s.h`等,它们包含了硬件寄存器的定义。 ```c #include "stc15f2k60s.h" ``` 2. **初始化定时器**: STC15W204S通常有多个可用的定时器,比如T1或T2。你需要配置定时器的工作模式和预分频。 ```c // 初始化定时器T1 void PWM_TimerInit(uint8_t channel) { // 设置工作模式和预分频... } ``` 3. **设置占空比**: 使用定时器的初值计算并设置每个PWM通道的占空比。例如,如果最高频率是8MHz,周期设为2^16,你可以通过调整高电平持续时间来得到不同的占空比。 ```c void Set_PWM_DutyCycle(uint8_t channel, uint16_t duty_cycle) { // 计算对应于给定占空比的定时器初值... TCNT[channel] = (2^16 - duty_cycle); } ``` 4. **更新IO**: 每次需要改变PWM输出时,更新对应的IO使其输出高低电平表示不同的占空比状态。 ```c void Update_PWM_Pin(uint8_t channel) { GPIOX |= 1 << (channel * 2); // 对应IO置高电平 // ... 或者 ... GPIOX &= ~(1 << (channel * 2)); // 置低电平 } ``` 5. **主循环**: 在主循环里不断读取用户输入或定时器溢出标志,然后更新IO和相应的PWM状态。 ```c while (1) { if (TimerOverFlow) // 检查定时器是否溢出 { TimerOverFlow = 0; Update_PWM_Pin(channel); // 更新其他通道... } // ... 其他处理 } ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值