Два кода, представленые ниже, это то, пока что я умею. Если с программным(delau_us(...); PORTx.x^=1;) ШИМом я еще более менее разобрался, то с аппаратным не очень.
я вчера вроде как вкурил то, например это OCR1AH и OCR1AL (L-младший, H-старший), и то, что в них записывается цифра от 0 до 1023. в шестнадцетеричной системе. Вобщем я запустил шим на обоих ножках PD4/5. Все крутится. Причем оба в одну сторону. Непонятно вот что, судя по формуле: число от 0...1023/10.23= W ШИМА в %. Когда я "изменял" мощьность (W) этого шима, например, записывая цифру 500(01ff) то разницы в скорости я них не заметил. Что я не так сделал ? И как заставить серву в другую сторону крутиться ?
Последний раз редактировалось S-T-A-L-K-E-R 13 авг 2010, 13:53, всего редактировалось 1 раз.
Т.е. если я заместо ICR1H=0x00; ICR1L=0x00; запишу так: ICR1=9216; (либо так: ICR1H=0x16;ICR1L=0x92;), то получу частоту в 50 Гц ? И потом запишу в OCR1BH = 0x4С; OCR1BL = 0x00; то серва на PORTD.4 будет находится в состоянии покоя ? (1500)
avr123.nm.ru Я тоже не могу ) Хотя учили... Пользуюсь калькулятором инженерным Я читал оба курса, но не один из них в полной мере не поясняет как всеже выставить все правильно чтоб работало ( Либо я еще не совсем это понимаю. Можешь в кратце объяснить как заставить серву крутитьсяв разные стороны, стоять. Дело в том что я пишу в CvAVR, а мне дали код из WinAVR, и мой компилятор не понимает что такое OCR1B...и тд. Может надо дерективу прописывать... незнаю.
//Init PWM for SERVO Control on PD4, PD5 //PWM, Phase and frequency correct, TOP=ICR1 TCCR1A=0xA0; //clear on up-counting, set on down-counting TCCR1B=0x12; //Clock prescaler 1/8 ICR1=9216; //Set 50Hz frequency
//Init PWM for SERVO Control on PD4, PD5 //PWM, Phase and frequency correct, TOP=ICR1 TCCR1A=0xA0; //clear on up-counting, set on down-counting TCCR1B=0x12; //Clock prescaler 1/8 ICR1=9216; //Set 50Hz frequency
Нет, конечно не так, от того что вы изменили паузу с 20 мкс на 19, и подключили две дерективы, ничего не изменится Вы хорошо разбераетесь в компиляторе CvAVR ? Просто он не все поймет из этой программы. Например: 1. uint16_t servoPosA=i; заменяем на int servoPosA=i; 2. OCR1B=servoPosB*23/50; тут компелятор не знает что это за "символ" OCR1B/A ! Я знаю что OCR1B/A состоит из двух регистров: OCR1AH (cтарший бит) и OCR1AL(младший бит). И в них записывается значение этой формулы: OCR1B=servoPosB*23/50; и это значение выдается на ножку порта D5. 3. Так как, уважаемые, заставить компилятор CvAVR заставить видеть OCR1B/A ?
А что именно записывать в BH и BL я не совсем понял ? OCR1Bl = servoPosB*23/50; OCR1BH = servoPosB; А точнее, как вытащить оттуда это число и расфасовать по H & L ?