PWM probleem

T

Tom2

Guest
Ik gebruik een analoge input voor pic en i een pwm.When ik de amplitute van de input i wilt wijzigen de plicht cyclus van de pwm.This niet happen.Is anyone know why.I gebruik Pic16F777 en PCM CCS compiler.Mijn code is:

#
include <16F777.h>
# apparaat ADC = 16
# zekeringen XT, NOWDT, NOPROTECT
# gebruik vertraging (clock = 4000000)
/ / lange duty_cycle, periode;void main ()
(
lange adc_result;

setup_adc_ports (ALL_ANALOG);
setup_adc (ADC_CLOCK_DIV_16);
setup_ccp1 (CCP_PWM);
setup_timer_2 (T2_DIV_BY_1, 255, 1);
While (1)
(
set_adc_channel (0);
delay_ms (1);
adc_result = read_adc ();
adc_result>> = 6;
set_pwm1_duty (adc_result);

)
)

 
Hoi!
Waarom bent u dit te doen

adc_result>> = 6;

Want als het resultaat is dat 1023 (3FF, zoveel mogelijk)
en vervolgens na deze operatie zal het 15 (0x0f).Nu in de CCSC wanneer ur maken van het project en selecteer een bepaalde frequentie van het PWM dan blijkt dat het bereik van het recht cyclus die kunnen worden gebruikt.U hebt voor het verzenden van alleen de ADC-resultaten aan de set_pwm1_duty (), die valt binnen die marge.

Wat ik heb begrepen uit ur-instellingen is dat je het genereren van een PWM met een frequentie van 3.906Khz met recht cyclus programmeerbare 0- 1024.
zodat u donot hoeft te doen van enig recht een verschuiving van de ADC resultaat.Gewoon de resut en zet hem in de set_pwm1_duty (); functie en het zal werken.
Toch is het beter dat Firs vinkt u ur PWM functie door het uitvoeren van deze code in de while lus in plaats van de ADC-code.

set_pwm1_duty (512) / / 50% inschakelduur
Delay_ms (5000) / / controleren of de plicht cyclus met een omvang
set_pwm1_duty (768) / / 75% inschakelduur
Delay_ms (5000) / / controleren of de plicht cyclus met een omvang

zodra deze test is ok, en gebruik dan de ADC gebaseerd PWM code maar onthoud niet naar rechts verschuiven de adc_result.

hoop dat dit helpt.
Groeten.

 
Iets meer na imstruction
adc_result = read_adc (); ik de instructie
output_high (PIN_B0); en ik zie dat er iets mis kan gaan als ik lees de resultaten van de omzetter.while (1) (
set_adc_channel (0);
delay_us (1);

adc_result = read_adc ();

output_high (PIN_B0);
....}

 
Hoi!
Ik zal proberen om een code voor u.Intussen probeert u dit stukje code

set_adc_channel (0);
while (1) (
delay_ms (10);

adc_result = read_adc ();

output_high (PIN_B0);
....}

De vertraging is zeer kritisch.

Donot wanhoop als een leert alleen door middel van zijn fouten.

Groeten.

 
@ Waseem annuleerteken u alstublieft na de code voor hetzelfde.

 

Welcome to EDABoard.com

Sponsor

Back
Top