Перейти к содержанию
    

Nobodevi4

Участник
  • Постов

    13
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Nobodevi4

  • День рождения 18.10.1988

Контакты

  • ICQ
    Array

Информация

  • Город
    Array
  1. Спасибо, но мне нужен драйвер для квадратурного энкодера на Verilog.
  2. ну да, это и нужно реализовать на Verilog под ПЛИСину Saprtan 2...
  3. Описываю задачу: Есть квадратурный энкодер, который крепится на вал двигателя, при вращении вала двигателя с него поступают сигналы, синус и косинус метки (на рисунке они изображены как u1 и u2 они сдвинуты на 90 градусов друг относительно друга соответственно). Задача состоит в том, чтобы реализовать учетверение которое показано на схеме как +f о.с. и -f о.с. (в зависимости от того в какую сторону вращается вал двигателя), учетверение, как можно видеть на рисунке - это импульсы по переднему и заднему фронту синус и косинус метки. Ну и еще необходимо учесть признак изменения направления вращения вала - SX. ПЛИС пол которую все это делается - Spartan 2. Ну а работоспособность проверяется, как я думаю, в модельсиме, просто подать тестбенч (u1 и u2), а формироваться должно все остальное. На всякий случай: разрешающая способность энкодера: 2500 импульсов/на оборот. Номинальная скорость вращения вала двигателя : 1500 об/мин. Ниже выкладываю доп. материалы. ____.doc
  4. Собственно, есть квадратурный энкодер, он работает с процом AT91SAM7A3, драйвер для него написан на Си: -------------- Калибровка энкодера ---------------------------------- void Calibr(void){ U8 st; state = PIO_Get(&pinSinA); state <<= 1; // это SA st = PIO_Get(&pinCosA); //это CA state |= st; switch (state){ case 0: AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOB] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; frontC = POSITIVE; frontS = POSITIVE; break; case 1: AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOB] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; frontS = POSITIVE; frontC = NEGATIVE; break; case 2: AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOB] = AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; frontS = NEGATIVE; frontC = POSITIVE; break; case 3: AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOB] = AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; frontC = NEGATIVE; frontS = NEGATIVE; break; default: break; //avoid combination } } ------------------ Драйвер энкодера ---------------------------------------------------------- void ISR_SinA (void){ // Прерывания от синус-метки энкодера if(frontS == POSITIVE){//По переднему фронту if(state == 1){state = 3; TetaShaft += 1; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOB] = AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; frontS = NEGATIVE; goto mSin;} if(state == 0){state = 2; TetaShaft -= 1; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOB] = AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; frontS = NEGATIVE; goto mSin;} } if(frontS == NEGATIVE){//По зфднему фронту if(state == 2){state = 0; TetaShaft += 1; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOB] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; frontS = POSITIVE; goto mSin;} if(state == 3){state = 1; TetaShaft -= 1; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOB] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; frontS = POSITIVE; goto mSin;} } mSin: AT91C_BASE_PIOB -> PIO_ISR;//исключим повторный вход в прерывание } void ISR_CosA (void){ // Прерывания от косинус-метки энкодера if(frontC == POSITIVE){//По переднему фронту if(state == 0){state = 1; TetaShaft += 1; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; frontC = NEGATIVE; goto mCos;} if(state == 2){state = 3; TetaShaft -= 1; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; frontC = NEGATIVE; goto mCos;} } if(frontC == NEGATIVE){//По зфднему фронту if(state == 3){state = 2; TetaShaft +=1; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; frontC = POSITIVE; goto mCos;} if(state == 1){state = 0; TetaShaft -=1; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; frontC = POSITIVE; goto mCos;} } mCos: AT91C_BASE_PIOA -> PIO_ISR;// исключим повторный вход в прерывание } Нужно на Verilog перенести под Spartan 2. Нужна помощь. В частоности, не знаю как посчитать длительность импульсов синус/косинус меток. (На картинке). Ну и как следствие не знаю как драйвер начать писать. Всем заранее спасибо за помощь! ______________________.bmp
  5. клево...только это на VHDL, а я вот все со схемотехническим редактором мучаюсь...Не пойму как в блок памяти загнать таблицу значений синуса..... ='(
  6. ок, спс за примеры, а могу я сделать синус, используя, к примеру, обыкновенный счетчик и блок памяти? Ну, то есть, на счетчик будет подаваться какой-нить меандр и адреса будут перебираться, а в память загнать уже готовую таблицу значений синуса???? То есть, данные у меня - это будет функция, а адрес - это будет аргумент (угол). ???
  7. благодарю, буду работать. Если появятся вопросы - напишу. Блин, а вот примеры открыть не могу, так как я работаю в ISE 10.1 а они заточены для 11.2((
  8. ок, запустил генератор. File->New Project, назвал проект SIN, далее вылезает окно с запрашиваемыми параметрами. На вкладке Part (типа Family, Device, Package, Speed Grade) ну я их заполняю соответственно: Spartan2, xc2s100, tq144, -6. А зачем нужны еще 2 вкладки: Generation и Advanced? Далее вылезает окно Sine-Cosine Look-Up Table, в самой первой вкладке есть параметры Output Width и Theta Input Widhth и еще поле Memory ROM - это все зачем? И как мне посмотреть что эта кривая в итоге действительно синус? Всем заранее спасибо!
  9. Да? А что из себя представляет этот core-генератор и где его найти?
  10. почитал... и все же..не понимаю как на языке VHDL реализуется математика..... как например сделать обыкновенный синус? Что вообще в среде ISE он будет из себя представлять?
  11. Требуется реализовать векторную ШИМ на FPGA - ПЛИС Spartan II на кристалле XC2S100. Среда - ISE WebPack 10.1 (бесплатная ксилинксовская). Возможно ли вообще осуществить данную задачу и если возможно, то с чего начать? Вообще на VHDL можно реализовать математические операции? Синус создать там и тому подобное??? P.S. С языком VHDL дел раньше не имел вообще... Все заранее спасибо.
×
×
  • Создать...