基于GEC6818利用C语言编程,实现PWM2输出频率0.2Hz,占空比20%的方波。
时间: 2023-12-28 10:04:54 浏览: 101
PWM方波占空比可调,调速程序
5星 · 资源好评率100%
GEC6818开发板上有多个定时器和比较器可供使用,可以使用其中的一个定时器和一个比较器实现PWM输出。具体实现步骤如下:
1. 初始化定时器和比较器,设置定时器时钟源、计数模式和计数值,设置比较器输出模式和占空比。
2. 在定时器中断处理函数中更新比较器的占空比,并清除定时器中断标志。
3. 在主函数中启动定时器,并进入一个死循环。
以下是示例代码:
```c
#include "s5pv210.h"
#define FREQ 100000000 // 定时器时钟源频率
#define DUTY_CYCLE 20 // 占空比,单位为0.1%
#define PERIOD (FREQ / 2 / 0.2) // 方波周期
#define PULSE_WIDTH (PERIOD * DUTY_CYCLE / 1000) // 方波脉宽
void timer_init() {
TCFG0 &= ~(0xff << 8); // 定时器2时钟源为PCLK,预分频器为1
TCFG1 &= ~(0xf << 8); // 定时器2时钟源为MPLL,分频器为1
TCNTB2 = FREQ / PERIOD / 2 - 1; // 定时器2计数初值
TCON &= ~(0xf << 12); // 定时器2自动重装载模式
TCON |= 0x80; // 定时器2计数使能
}
void pwm_init() {
TCFG0 &= ~(0xf << 16); // 比较器2时钟源为PCLK,预分频器为1
TCFG1 &= ~(0xf << 12); // 比较器2时钟源为MPLL,分频器为1
TCON &= ~(0xf << 16); // 比较器2输出模式为PWM
TCON &= ~(0xf << 20); // 比较器2禁止中断
TCMPB2 = PULSE_WIDTH / 2 - 1; // 比较器2计数初值
TCON |= 0x40000; // 比较器2计数使能
}
void timer2_isr() {
static unsigned int count = 0;
count += FREQ / PERIOD;
if (count >= 1000) {
count -= 1000;
TCMPB2 = PULSE_WIDTH / 2 - 1;
} else if (count >= 500) {
TCMPB2 = 0;
} else {
TCMPB2 = PULSE_WIDTH - 1;
}
TINT_CSTAT |= 1 << 6; // 清除定时器2中断标志
}
void main() {
timer_init();
pwm_init();
INTMSK &= ~(1 << 14); // 允许定时器2中断
intc_setvectaddr(NUM_TIMER2, timer2_isr); // 设置定时器2中断向量地址
intc_enable(NUM_TIMER2); // 使能定时器2中断
while (1) {} // 进入死循环
}
```
在上述代码中,定时器2和比较器2分别用于生成定时器中断和PWM输出。定时器中断每隔0.5秒触发一次,更新比较器2的占空比。比较器2在PWM模式下输出方波,占空比为20%。运行程序后,可以通过示波器测量PWM输出波形的频率和占空比是否符合要求。
阅读全文