Pin13 上LED亮度减半的问题

网上有朋友提了一个问题“arduino怎么把13号引脚的亮度减小一半”。自然而然的想法是用PWM做,查一下资料,非常不幸 Uno的Pin13不是PWM。

pin13

我们只能采用模拟PWM的方式来做。首先想到的是直接在 Timer0 的ISR (在\hardware\arduino\avr\cores\arduino\wiring.c)上加入内容。但是实验结果非常糟糕,肉眼能够看到LED在闪烁。于是,需要自己设置一个快速的中断,然后在里面写拉高低的代码。
最终找到tsaiwn 编写的代码【参考1】。直接在上面修改:
设定的亮度有十级别,0是最亮,9是最暗。

// 控制 LED 亮滅, 每秒閃爍 5000 次: 亮 0.0001 秒滅 0.0001 秒 ...
// Prescaler 用 64
volatile int ggyy = 1; // 使用這當 Flag 給 ISR 使用 !
int ledPin =13;

unsigned char myPWM=0;
unsigned char myPCounter=0;
/// For Prescaler == 64
/// 1 秒 / (16 000 000 / 64) = 1/250000 = 0.000004 sec / per cycle
/// 0.1 sec / 0.000004 sec -1 = 25000 -1 = 24999
/// 0.0001 sec / 0.000004 sec -1 = 25 -1 = 24
const int myTOP = 24; // 0.0001 sec when Prescaler == 64
///// Interrupt Service Routine for TIMER1 CTC on OCR1A as TOP
/// 注意以下名稱是有意義的, 不可亂改 !
ISR(TIMER1_COMPA_vect)
{
//digitalWrite(ledPin, ggyy); // ggyy 是 0 或 1
//ggyy = 1 - ggyy; // 給下次進入 ISR 用
myPCounter++;
if ((myPCounter % 10) >= myPWM)
{
digitalWrite(ledPin, HIGH);
}
else
{
digitalWrite(ledPin, LOW);
}

}
void setup( ) {
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW); // turn Off the LED
cli(); // 禁止中斷
TCCR1A = 0;
TCCR1B = (1<

发表评论

电子邮件地址不会被公开。 必填项已用*标注