- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在 ATMega328P 上试验 PWM 波形生成模式。我得到了一些奇怪的结果,我无法确定是我编写固件的方式有问题还是我解释 datasheet 的方式有问题。 .
这是我为模拟 analogWrite() 函数编写的第一段代码:
// Waveform Generation Mode 0
// Table 15-4 of the datasheet
void setup()
{
DDRB = (1<<PB1); // set pin 9 as output
TCCR1A |= (1<<COM1A1);
OCR1A = 125;
}
void loop()
{
}
上面的代码从引脚 9 产生了大约 2.5V(49% 占空比)的平均电压输出。奇怪的是(对我来说)根据数据表,TIMER1 是一个 16 位定时器,所以它应该溢出在 65536 个刻度。据我了解,将 OCR1A 设置在 0 到 65535 之间会改变脉冲的占空比。因此,将 OCR1A 设置为 125 后,我不应该得到大约 0.01 V 而不是 2.5V 的输出吗?结果似乎暗示时钟在 255 处溢出。
第二次涉足 PWM 领域时,我想尝试使用 ATMega 的快速 PWM 模式创建 2.5V 信号。这是我得到的:
// Waveform Generation Mode 14
// Table 15-4 of the datasheet
void setup()
{
DDRB = (1<<PB1);
TCCR1A |= (1<<COM1A1) | (1<<WGM11);
TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS10);
ICR1 = 19999;
OCR1A = 10000;
}
void loop()
{
}
我将 ICR1(溢出值)任意设置为 20000 个滴答,然后将 OCR1A(比较值)设置为其一半左右。我将 channel A 设置为非反相模式,但(我认为)如果我将其设置为反相模式,它不会有什么不同。当我将它闪存到 Arduino 上时,我从引脚 9 获得了 5V 的稳定平均电压(100% 占空比),但我终究无法弄清楚原因。
如果您能提供任何见解,我将不胜感激。
最佳答案
joeymorin 在 AVRfreaks 上的回答:
请注意,在 Uno 上,在 setup() 之前运行的 Arduino 初始化代码配置了很多东西,包括 328P 上的所有三个计时器。
来自wiring.c:
sbi(TCCR0A, WGM01);
sbi(TCCR0A, WGM00);
sbi(TCCR0B, CS01);
sbi(TCCR0B, CS00);
sbi(TIMSK0, TOIE0);
sbi(TCCR1B, CS11);
sbi(TCCR1B, CS10);
sbi(TCCR1A, WGM10);
sbi(TCCR2B, CS22);
sbi(TCCR2A, WGM20);
这将以 64 的预分频器启动所有三个定时器。
TIMER0 被置于模式 3(快速 PWM)并启用溢出中断以支持计时功能(millis()、micros() 和 delay())。
TIMER1 置于模式 1(固定 8 位相位校正 PWM)。
TIMER2 置于模式 1(相位校正 PWM)。
void setup()
{
DDRB = (1<<PB1); // set pin 9 as output
TCCR1A |= (1<<COM1A1);
OCR1A = 125;
}
void loop()
{
}
由于 TCCR1A 中的 WGM10 已设置,设置 COM1A1 将在非反相模式下启用 PWM 输出,就像 analogWrite() 一样。
TIMER1 is a 16bit timer, so it should overflow at 65536 ticks. From what I understand setting OCR1A between 0 and 65535 will change the duty cycle of the pulse. So, having set the OCR1A at 125, shouldn't I be getting an output of around 0.01 V instead of 2.5V? The results seem to imply that the clock is overflowing at 255.
在模式 1 中,它的行为类似于 8 位定时器。
void setup()
{
DDRB = (1<<PB1);
TCCR1A |= (1<<COM1A1) | (1<<WGM11);
TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS10);
ICR1 = 19999;
OCR1A = 10000;
}
void loop()
{
}
由于 TCCR1A 中的 WGM10 已设置,设置 WGM11、WGM13 和 WGM12 将选择模式 15,而不是模式 14。模式 15 是快速 PWM,TOP = OCR1A(不是 ICR1)。由于您还使用 COM1A1 为 PWM 设置 OC1A 输出,这将导致 OC1A 保持高电平。
如前所述,如果您想在 Arduino 环境中配置定时器,您应该从头开始使用 = 而不是 |=。
theusch 写道:
And, for all I know, more might be run after setup()
来自 Arduino 的 main.cpp:代码:
#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USB.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
张杰
关于Arduino Uno PWM - 奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21371678/
我按照说明操作 here用于设置 wpf 主机,但应用程序启动时从未加载我的代码。我还尝试让 WASM 调试工作但没有成功。也就是说,如果可能的话,我宁愿拥有一个 wpf 主机,因为我认为这将提供更快
我正在尝试在 Arduino UNO 上执行算法,它需要包含一些大数字的常量表,有时,我会得到溢出值。这个数字就是这种情况:628331966747.0 好吧,这是一个大的,但它的类型是 float(
当我运行 Wasm 应用程序头时,在应用程序 UI 出现之前,最初会出现 Uno 平台启动画面(带有白色背景)。有时,启动画面图像 (splashscreen.scale-200.png) 及其指定的
我正在尝试让 HTML 文件上传控件在 WASM 上运行。到目前为止,我已尝试执行以下操作: [HtmlElement("input")] public class FilePickerView :
我想使用 16MHz Arduino Uno (ATMEGA328P) 设置自定义频率 (12Hz) 和占空比 (20%)。 AVR 计算器产量: ICR1 = 20833 OCR1A = 4167
我想使用 16MHz Arduino Uno (ATMEGA328P) 设置自定义频率 (12Hz) 和占空比 (20%)。 AVR 计算器产量: ICR1 = 20833 OCR1A = 4167
我尝试使用以下方法,但它们在 Uno (Android) 中都显示为未实现。我能做什么? 是否有任何 Xamarin.Essentials 替代品? 或其他NuGet 包? 或者我应该在每个平台上使用
我有一个基于 un uno 平台的简单应用程序。在 Windows 上,我可以毫无问题地构建和运行它。但是在 VS for Mac 上,编译器对自动生成的 RemoteControl.g.cs 文件给
我有一个问题,我只是尝试添加新文本,然后对其应用 LibreOffice 样式。我想添加文本并使其遵循特定样式(“标题 1”、“标题 2”等)。 向文档添加文本确实有效,更改样式也有效,但最后的样式集
Closed. This question needs debugging details。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。 上个月关闭。 I
我正在尝试读取RFID标签号由视差 RFID 阅读器扫描并使用 Arduino 设备发送到计算机。我正在尝试使用RXTXCommDrive从串行端口读取数据,但问题是当Arduino连接到PC时,它连
作为我正在进行的项目的一部分,我收到了一个 arduino uno 和一些代码。我以前从未与他们合作过,所以这对我来说是一次全新的体验。 我正在使用他们网站上的 Arduino 应用程序,当我编译代码
这是我的页面 HTML 代码。我这里使用了JQuery。 ESP8266 LED 控制 tags below the ID attribute is the value sent to the ar
我得到了我的 Arduino Uno,昨天碰巧停止被计算机识别。电路板上的红色 LED 工作正常,所以这是一个好兆头,但是当我通过 USB 连接它时,它不会在下方通知我-某些设备已连接的屏幕右侧。同样
我正在尝试在 Uno 平台上将音频流和视频流合并到一个文件中,特别是对于 WebAssembly。 我已经知道正常的、仅限桌面的方法是调用 ffmpeg ,而且我还找到了 UWP here 的唯一 C
有谁知道是否有办法在 Uno-Platform 应用程序中嵌入 OpenGL View ?我需要它在 iOS、macOS、Android 和 UWP 上工作。我有很多 C#/Xamarin 代码我想重
我需要帮助,我正在使用 Arduino UNO 和 GPRS 扩展板,它由输出 12v 500mA 的适配器供电。 SIM 卡放置正确,我用 AT+CPIN? 命令检查了这一点,但是当我尝试用 AT+
我需要帮助,我正在使用 Arduino UNO 和 GPRS 扩展板,它由输出 12v 500mA 的适配器供电。 SIM 卡放置正确,我用 AT+CPIN? 命令检查了这一点,但是当我尝试用 AT+
我是一名尝试硬件的程序员 我正在尝试连接我在网上购买的 SIM900 扩展板。因此,我按照大量教程将 SIM 扩展板与 Arduino UNO 连接起来。 嗯,事情进展得不太顺利。 我在里面放了一个解
我一直在 ATMega328P 上试验 PWM 波形生成模式。我得到了一些奇怪的结果,我无法确定是我编写固件的方式有问题还是我解释 datasheet 的方式有问题。 . 这是我为模拟 analogW
我是一名优秀的程序员,十分优秀!