2017-08-30 1 views
2

Je tente de générer un signal en quadrature, mais avec l'opération la plus faible possible. J'utilise une STM32 et une broche GPIO B8 et B9 pour envoyer le signal. couple des broches 8 et 9 ont quatre options possibles qui sont dans le sens des aiguilles d'une montre: 0/0 1/0 1/1 et 0/1 et dans le sens inverse des aiguilles d'une montre 0/0 0/1 1/1 1/0 I ne peut pas trouver le chemin avec bit pour pouvoir rapidement définir ou réinitialiser le bit pour la broche sélectionnée. De plus, je dois être capable d'aller dans le sens de l'horloge ou du contre-sens et de changer de sens chaque fois que je le souhaite, qu'il s'agisse d'un codeur rotatif ou linéaire.Génération de signaux en quadrature avec manipulation de bits

Merci pour votre aide

+0

Incrément/décrément (modulo 4)? – wildplasser

+0

qui ne produira pas la séquence 0,1,3,2 requise – berendi

Répondre

2

Bit-banging

pensée Bitwise, B9 obtient la valeur précédente de B8 et B8 obtient l'inverse de B9, ou l'inverse lorsque le compte à rebours. Vous permutez les deux bits, et exclusif ou avec 0x100 ou 0x200 selon la direction.

inline void incB89(int down) { 
    uint32_t temp; 

    /* read the current output state */ 
    temp = GPIOB->ODR; 

    /* modifying the significant bit-pair 
     don't care about overflow */ 
    temp = (((temp & 0x100) << 1) | ((temp & 0x200) >> 1))^(0x100 << down); 

    /* Setting the reset bits BR8 and BR9. This has the effect that 
     bits 8 and 9 will be copied into the ODR, and the rest will 
     be left alone */ 
    temp |= ((1 << 24) | (1 << 25)); 

    GPIOB->BSRR = temp; 
} 

l'aide d'une minuterie (ou deux)

Sur la plupart des contrôleurs de la série STM32, TIM4 canaux 3 et 4 sorties peuvent être mis en correspondance avec PB8 et PB9. Si vous en possédez une, cette minuterie peut contrôler les sorties de manière autonome, sans être affectée par le code, la mémoire ou la latence d'interruption.

  • Définissez le mode GPIO et les registres de fonction alternatifs conformément au manuel de référence de votre automate.
  • Configurez les modes 3 et 4 en mode basculement, définissez les bits OC1M et OC2M en TIM4->CCMR1 à 0b011.
  • Définissez l'horloge d'entrée, le précalcul PSC et rechargez ARR pour obtenir deux fois la fréquence souhaitée, car chaque sortie sera basculée une fois dans chaque cycle de minuterie.
  • Définir TIM4->CCR3=0 et TIM4->CCR4=(TIM4->ARR+1)/2 pour le comptage dans une direction. Remplacez-les (lorsque le compteur est arrêté) pour inverser la direction. Activer les sorties dans TIM4->CCER.
  • Vous pouvez démarrer et arrêter le comptage en définissant ou en réinitialisant le bit CEN de TIM4->CR1.
  • Pour compter les cycles, vous pouvez configurer une interruption pour basculer ou mettre à jour les événements dans TIM4->DIER ou utiliser une autre horloge comme esclave pour TIM4.

Pour utiliser par ex. TIM3 pour compter:

  • Définir les MMS bits dans TIM4->CR2-0b010 pour délivrer en sortie une impulsion de déclenchement sur chaque débordement.
  • Configurez TIM3->SMCR en mode horloge externe 1 et sélectionnez le déclencheur interne de TIM4.
  • Définissez TIM3->ARR sur le nombre requis de demi-cycles - 1.
  • Configurez une interruption lors de la mise à jour.
  • Démarrez le compteur.

Il y a quelques trucs plus possibles avec des minuteries, comme l'utilisation de rafales DMA déclenchées par l'esclave de mettre à jour les registres ARR et CCR de la minuterie maître d'une table de valeurs « wawelength ».

+0

Salut berendi, merci pour votre aide. Je voudrais comprendre l'utilisation de la variable vers le bas? ce que je suis censé utiliser? J'utilisais la minuterie pour lire le codeur en quadrature. votre installation semble être très détaillée, je vais l'étudier de près .. – vib

+0

'down' inverse la direction. Quand 'down == 0', le décalage de bit ne fait rien, le bit 8 est inversé après l'échange. Quand 'down == 1', le masque sera décalé et le bit 9 sera inversé. – berendi

+0

OK merci beaucoup. Pourriez-vous afficher le fichier main.c avec le minuteur comme décrit? J'ai essayé quelque chose mais je ne comprends pas tous les paramètres, donc je n'ai pas l'onde carrée désirée. Ce serait très gentil;) – vib