How to pour développer sur les voitures de la Freescale
Cup sur base Kinetis K40 / caméra linéaire
T. Grandpierre -avril
2013
Les infos de base sont disponibles sur le site de Freescale dédié à la coupe :
· page d’accueil : https://community.freescale.com/docs/DOC-1284
o règlement : https://community.freescale.com/docs/DOC-93225 (nous sommes dans la région « EMEA »)
o Matériel :
§ Processeur : https://community.freescale.com/docs/DOC-1096 (nous avons choisi le processeur K40 Kinetis car les enseignements de programmation sur microcontrôleurs se font sur Cortex-M en E1 à l’ESIEE)
§ Caméra : https://community.freescale.com/docs/DOC-1030
§ Carte Puissance (pont en H) : https://community.freescale.com/docs/DOC-1059
· pages ESIEE dédiées à la Freescale Cup
o http://www.esiee.fr/freescalecup2013/
o http://www.esiee.fr/Actualites/actualite_finale2013_freescalecup.php
o pages techniques : http://www.esiee.fr/~grandpit/FC/QuickStartFreescaleCupTG.htm
Les fichiers projets référencés dans ce document se trouvent ici :
http://intra.esiee.fr/~grandpit/FC/freescalecupmaterialTG.zip (lien intra)
https://extra.esiee.fr/~grandpit/FC/freescalecupmaterialTG.zip (lien extra)
IDE : Code
Warrior « CW_MCU_v10.2_SE.exe »
Nous avons utilisé la version windows
de Code Warrior limitée en taille de binaire généré
mais illimité dans le temps :
http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=CW-MCU10&fpsp=1&tab=Design_Tools_Tab
et dans la colonne de droite : Special
Edition: CodeWarrior for Microcontrollers 10.2 (Eclipse, Windows ...
Drivers USB : c'est PnE, dans les projets sélectionner
OSJTAG pour la Tower k40
-Sur mon PC bureau ESIEE sous XP, problème : j'ai dû désinstaller tous les
drivers et installer les driversP&E.zip
-Sur mon PC perso. (win7), j'ai installé
les drivers 64bits (PEDrivers_install.exe, P&E
Hardware Interface Drivers, Version 11 (Windows XP/Vista/7))
=>j'essaie aussi l'OSBDM Virtual Serial Toolkit qui permet d'accéder au port
serie par usb (http://www.pemicro.com/osbdm/index.cfm)
(pemicro_osbdm_osjtag_tower_toolkit.exe) et j'essaie avec
free-virtual-serial-ports.exe de hddsoftware.com.
===>Echec, P&E m'a informé que leur nouveau OSBDM firmware permet de voir la liaison série du BDM comme un comm. port standard (CDC), pour ca il faut juste faire un update firmware avec firmware_updater_install.exe de p&e (le numéro firmware est 31.21).
Procédure pour faire du serial other usb :
1) faire un update du firmware de l'interface JTAG/BDM de la carte tower avec le logiciel firmware_updater_install.exe sur le site de pemicro.com . Il suffit de l'installer, le lancer, choisir OSBDM, Kinetis puis quand il le demande débrancher la carte et ajouter le jumper JM60 sous l'écran du lcd (Normalement toutes les cartes ont été flashée maintenant, en avril)
2) quand on rebranche la carte twr : un nouveau port com apparait
3)Ensuite il suffit de changer votre appli tower pour qu'elle utilise ce com port qui passe par l’usb et partagé avec le : k40_platform.h ET io.c (voir plus bas)
1) Pour la clock : J'ai repris l'exemple d'initclock donné dans Kinetis Quick Reference User Guide (KQRUG.pdf)
2)
Infos PWM :
En plus du datasheet voir document : PWM Synchronization Using Kinetis
Flextimers (AN4560.pdf) et Using FlexTimer in ACIM/PMSM Motor Control Applications
(AN 3729.pdf)
3) Cablage : (voir derniere version dans les commentaires du code)
a.
Propulsion :
PTA8 sur elevateur B68 = PORTA_PCR(8) = port_pcr_mux(3) | ...(ALT 3
FTM1_CH0)
PTA9 sur elevateur B67 = PORTA_PCR(9) = mux (3) (ALT 3 FTM1_CH1)
enable irq commenté et le code de motor tick aussi
=> utilise donc FTM1
Et donc modifier aussi :
//Enable the Clock to the FTM1 Module
SIM_SCGC6 |= SIM_SCGC6_FTM1_MASK;
b.
Servo :
PTA6 sur elevateur A64 = PORTA_PCR6 = mux(3)
(ou a essayé sur PC4 (ALT 4) FM0_CH3 mais ne sortait aucun signal)
Ca utilise donc FTM0
enable_irq (INT-FTM0-16) + modif ligne 145 de kinetis_sysinit.c pour les
vecteurs d'IT par irq 79 = servotickirq
Création d’un nouveau projet depuis scratch :
a)créer un nouveau projet : new bareboard project, puis device
K40->PK40X256, OpenSourceJTAG, puis reste par défaut
b)ajout des morceaux de gpio pour leds dans main
c)ajout du systick (pour delay) : copier dans header et source les fichiers
/CPU/systick.h et .c ainsi que clock.h et .c
d)dans main ajout de initsystick() et dans
projects_Settings/Startup_code/kinetis_sysinit.c ajout de l'include systick.h
et de l'it numero 15
e)AJOUT PWM : copier PWM/PWM_servo.c et .h ainsi que PWM_motor.c et .h, copier
aussi CPU/arm_cm4.c et .h pour def. de enable_irq utilisé
dans PWM_servo.c, modifier IRQ 78 de kinetis_sysinit.c
f)OK pour RAM mais pas en FLASH en copiant le clock.c (fonction initclock)
venant du projet Kwikstick car le quartz est à....8Mhz sur TWR contre 4Mhz sur
KS!! J'ai repris l'exemple d'initclock donné dans
Kinetis Quick Reference User Guide (KQRUG.pdf)
D'ailleurs celui du KS provient de là (voir video youtube : clock kinetis)
=>ca marche en flash aussi alors qu'en flash tout plantait.
4) Liason série (pour utiliser la liaison série other USB), 2 fichiers :
k40_platform.h :
a. #define TERMINAL_BAUD 9600
b. #define TERM_PORT UART3_BASE_PTR
io.c : #define
TERM_PORT UART0_BASE_PTR
Le project ESIEE_CARv0.zip
contient un projet CW complet qui regroupe tout :
Il fait des acquisitions camera envoyées sur la liaison série + calcul
gradient,
+ modifie la vitesse + consigne de position
ATTENTION CE CODE N’EST PAS DU TOUT Optimisé, = BASE de DEPART
cablage (revoir dans les commentaires dans code) :
PWM servo : A64
PWM Moteurs : B67 et B68
Masses : A81,B81, A2,B2, A5,B5,A6,B6
+5v : A1, B1
Avec ce code pour mon servo les valeurs min max de consigne sont 4-7 et ~5 pour
le neutre
Camera :
Clock portA_12 : A25
SI portA_13 : A23
Analog portE_0 : B22
Pour info l'UART de la carte TWR-SER utilisée c'est l'UART3 sur
PortC_16 (RX du K40,SCI3 RX) : A43
PORTC_17 (TX du K40, SCI3 TX) : A44
2 projets (voir répertoire « 2-ProjetsPourAffichageImageSurPC » du zip)
1) sur la kinetis : ESIEE_CARv1.1Kinetis.zip
2) sur le PC : PC_ReadLineTWRv3-visual2010.zip (basé sur ofw)
Pour le tester il faut:
0) faire les connexions entre la caméra et la Tower qui sont dans le code
source.
1) Sous CodeWarrior : passez en mode debug (la première fois choisir
"test_camera twrk40....INTERNAL_RAM_OSJTAG dans debug configuration)
2) Lancer l’exécution sur la tower
3) Lancer SerialExampleDebug.exe sur le PC (attention pour le moment il est
codé en dur avec le port COM8, Cf. plus bas pour le recompiler)
4) Cliquer dans la fenêtre graphique pour lancer l'échange de données entre la
carte et le PC.
=> la fenêtre affiche alors l'image de la caméra et d'autres infos que je vous
laisse découvrir...
=======================================
Pour recompiler l'application PC OFW , il faut :
1) MS visual 2010 (fonctionne aussi sous linux, mac etc)
2) télécharger OpenFramework : http://www.openframeworks.cc/download/
=> choisir Windows=> visual studio 2010
vous devriez alors télécharger le fichier : of_v0073_vs2010_release.zip
3) le dézipper où vous voulez
4) déplacer mon sous-repertoire PC_ReadLineTWRv3 pour le mettre dans le
sous répertoire d'exemples de communication (dont je me suis fortement inspiré !)
: \of_v0073_vs2010_release\examples\communication\
5) et ouvrir le projet SerialExample.sln sous visual 2010, le compiler et le
lancer (l'exécutable est dans /bin)
=======================================
Ce projet contient 3 fichiers sources:
a) main.cpp qui déclare surtout la taille de la fenêtre graphique : pour moi
255 de large par 260 de haut
b) testApp.h qui contient la déclaration de la classe testApp : c'est là que
vous pouvez déclarer les variables à communiquer entre
la partie communication RS232 et la partie affichage graphique
c) testApp.cpp qui contient tout le code :
- fonction setup => pour changer le numéro de com port (COM8 etc..)
-fonction update => fonction qui se charge de communiquer avec la carte avec
les fonctions serial.writeByte et serial.ReadByte
-fonction draw => pour dessiner l’image venant de la caméra ainsi que calcul
des gradients etc
Le rapport final et le code de ce qui a tourné lors de la coupe est dans le répertoire « 3-RapportEtCodeFinal »
· Le calcul de l’asservissement se fait en flottant
· La partie « vision » n’a pas été optimisée
· Le PID ne s’exécute pas à période constante (car la durée de la boucle principale dépend de la durée du traitement côté vision)è pas d’IT pour le moment
· Un seul PID, une seule vitesse…
· Besoin d’enregistrer les données (images, erreur de l’asserv. ) et d’afficher ces infos pour post-interprétation : la kinetis peut enregistrer sur carte SD (ou on envoie par Zigbee). Il existe un exemple qq part pour l’utilisation de la carte SD, mais il est basé sur le micro OS Freescale è c’est peut être l’occasion de l’essayer pour résoudre pb. précédent du PID.
· Pas de freinage (inversion sur pont en H non modifiée) pour le moment