Я не могу понять, как установить период сигнала ШИМ - PullRequest
0 голосов
/ 26 апреля 2019

Я хотел бы создать сигнал ШИМ. И я хочу, чтобы частота была близка к 38 кГц. Мой теоретический расчет за период составляет 26,3 микросекунды. Поэтому я выбираю 26 микросекунд. И я могу наблюдать за моим сигналом.

Но я не понимаю, как мой код работает должным образом:)

(моя тактовая частота равна 1 МГц, поэтому мой тактовый сигнал равен 1 микросекунде)

if((P1IN & BIT3)!=BIT3)  { // if button is pressed

for(i=0;i<692;i++){   // pwm signal's duration is 9ms
P2OUT^=0x01;       // switch from 1 to 0 or vice versa
__delay_cycles(4);   
}
P2OUT=0x00;
}

мой расчет:

i <692, i ++, P2OUT ^ = 0x01; // всего 3 цикла </p>

__ delay_cycles (4); // всего 4 цикла

, поэтому 4 + 3 = 7. но я запутался, потому что я думаю, что это должно быть 13, а не 7

(вот мой сигнал) https://e2e.ti.com/cfs-file/__key/communityserver-discussions-components-files/166/f0fd36b0_2D00_bebd_2D00_4a31_2D00_b564_2D00_98962cf4749e-_2800_1_2900_.jpg

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Вы не можете рассчитывать циклы на основе кода C или C ++. Вам необходимо проверить файл (ы) сборки, сгенерированные во время компиляции программы. На основе вашего компилятора (который вы не упомянули) вы можете передать некоторые параметры / параметры компилятора, чтобы попросить компилятор оставить сгенерированные файлы сборки на месте, чтобы вы могли проверить сгенерированные инструкции по сборке. но в основном цикл for будет содержать инструкцию перехода, которая может занять 2/3 цикла, а вы не рассчитали это.

Я рекомендую вам позже проверить количество циклов каждой инструкции из таблицы данных микроконтроллера.

0 голосов
/ 27 апреля 2019

Отправленный код (согласно вашим расчетам) переключает вывод каждые ~ 7 циклов.и делает это 692 раза.Всего 346 циклов, однако общее время включения импульса составляет всего ~ 7 циклов.Предложите:

if((P1IN & BIT3)!=BIT3)  
{ // if button is pressed
    // start pwm signal
    P2OUT = 0x01;

    for(int i=0; i< (9*1000);i++) // may need to be adjusted   
    {                  // so pwm signal's duration is 9ms
        _delay( 1 ); 
    }

    // stop pwm signal
    P2OUT=0x00;

    // wait for button to be released
    while( P1IN & BIT3)!=BIT3 ){;}
}

Я не знаком с деталями ШИМ вашего микроконтроллера. Однако большинство из них имеют инициализацию для установки скорости подсчета таймера ШИМ и его счетчика начала / завершения, а также повторения и выходаявляется прямоугольной волной или сигналом повышения или понижения и процентом времени ON .vs.OFF.

Однако опубликованный код указывает на то, что ШИМ является только обычным битом GPIO.

Опубликованный код указывает на то, что ШИМ в процентах должно составлять 50 процентов.Это то, что вы хотите?

...