이것은 학문적 인 질문입니다. (필자는 반드시 그런 일을 할 계획이 아니지만) 어떻게 작동하는지 궁금합니다. 나는 유저 랜드 소프트웨어 (하드웨어가 아닌) 솔루션을 생각하고있다.CPU를 손상시키지 않고 소프트웨어 PWM을 사용할 수 있습니까?
나는 PWM 신호를 생성하고 싶다. (디지털 GPIO 핀 수가 적지 만 1 개 이상이라면). 아마도 Pthread를 생성 한 프로그램을 작성한 다음 해당 스레드에서 적절한 sleep()
등을 사용하여 듀티 사이클 동안 무한대로 루프를 반복하여 비율을 올바르게 얻을 수 있습니다.
CPU가 끔찍하게 들썩 거리지 않습니까? 나는 주파수가 100 Hz 표기 어딘가에있을 것이라고 상상한다. 나는 전에 이런 식으로 아무것도하지 않았지만 상수 반복, 컨텍스트 스위치 등 멀티 태스킹이나 CPU 사용에 좋지 않을 것이라고 상상할 수 있습니다.
이 경우 CPU 사용 및 멀티 태스킹에 대한 조언이 필요하십니까? FWIW 나는 싱글 코어 프로세서에 대해서 생각하고있다. 나는 응답이 에서 시스템의 사용을 불가능하게 만들 수 있습니다. to '관련 숫자는 현대 프로세서에 영향을 미치는 것보다 작습니다.'!
C가 가장 적합한 것으로 가정합니다.
EDIT : 하드웨어 GPIO 핀에 액세스 할 수있는 컴퓨터에서 Linux 또는 기타 범용 POSIX 운영 체제를 사용한다고 가정합니다.
EDIT : 나는 수면 모드로 PWM을 구현하는 방법이 분명하다고 가정했다. 이 같은 의심의 회피, 뭔가 :
while (TRUE)
{
// Set all channels high
for (int c = 0; x < NUM_CHANNELS)
{
set_gpio_pin(c, 1);
}
// Loop over units within duty cycle
for (int x = 0; x < DUTY_CYCLE_UNITS; x++)
{
// Set channels low when their number is up
for (int c = 0; x < NUM_CHANNELS)
{
if (x > CHANNELS[c])
{
set_gpio_pin(c, 0);
}
}
sleep(DUTY_CYCLE_UNIT);
}
}
듀티 사이클은 핀이 높은 시간과 신호의주기 사이의 비율을 나타내며 백분율로 표시됩니다. 100Hz는 신호 주파수이며 10ms의주기를가집니다. – guga
PWM의 특성, 특히 출력 신호의 정확도와 안정성을 지정해야합니다. 듀티 사이클 또는 기본 주파수에서 PWM 신호의 지터를 조정할 수 있습니까? 소프트웨어 PWM은 타이밍 지터가 많이 발생합니다. –
그냥 취미 목적으로, 예를 들어 조명 조광기를 운전. 정확성은 그다지 중요하지 않습니다. 나는 지터가 예상된다고 생각한다. 내가 말했듯이, 학문적 인 질문이지, 내가 반드시 만들어야 할 것이 아닙니다. – Joe