c - 我怎样才能解决这个问题。“__builtin_avr_delay_cycles 需要一个编译时间整数常量”
问题描述
我正在使用带有atmega32A MCU的伺服电机。我想通过将度数发送到函数来转动电机。这是我的主要方法。
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
#include "servo.h"
int main(void)
{
DDRC = 0b00000001;
PORTC = 0x00;
while(1)
{
turnTo(90);
}
}
这是我的伺服电机代码。
#ifndef F_CPU
#define F_CPU 8000000UL // 8 MHz clock speed
#endif
#include <avr/io.h>
#include <util/delay.h>
int turnTo(double degree){
int pulse=(degree*500/90)+1000;
PORTC = 0x01;
_delay_us(pulse);
PORTC = 0x00;
return 0;
}
我尝试了以下答案。但是什么都没奏效。我怎样才能解决这个问题?
解决方案
延迟函数在编译期间计算no operation
循环,不能在控制器上动态。所以尝试添加这样的函数:
void wait(unsigned int us)
{
for(unsigned int i=0; i < us; i++)
{
_delay_us(1);
}
}
并调整您的程序
int turnTo(double degree){
unsigned int pulse=(degree*500/90)+1000;
PORTC = 0x01;
wait(pulse)
PORTC = 0x00;
return 0;
}
这并不完全是因为 for 循环也需要一些汇编指令。目前我没有要检查的编译器,但您可以通过计算编译器使用的汇编指令和调整
us
变量来更正结果。更好的解决方案是使用计时器而不是延迟。它们具有更好的延迟精度,并且控制器可以在计数期间执行其他操作!
推荐阅读
- c# - Hellang ProblemDetails 在 500 http ASP.NET CORE 2.2 时隐藏真正的异常
- java - 错误:找不到符号方法 getSystemService(Class
) - c++ - 使用两个旧对象在模板 constexpr 函数中创建一个新对象
- python - 如何将一个元素与python子列表中的每个第一个元素进行比较?
- r - 无法安装“org.Mm.eg.db” - 退出状态为零?
- typescript - 在整个 TypeScript 项目中自动修复导入?
- java - Maven 插件 MOJO 在解决依赖关系时会阻止构建
- vue.js - 使用 API 和 JWT 令牌时如何保护 Vue.js 路由?
- c - 由于某种原因,最后一个字母输入+ 1
- regex - 用双换行符替换三换行符