Ook die laatste werkt zeer eenvoudig: zolang dat B0 door de puls naar nul getrokken wordt, wordt per 10us (slechts een honderdduizendste van een seconde!) RC[1] met ééntje verhoogd.
Als vervolgens de puls eindigt en B0 opnieuw '1' wordt, wordt er uit de lus gesprongen, om met een bijna identiek systeem de andere puls op B1 ook te meten.
Vervolgens worden de waardes (lengte van de pulsen) naar het LCD geschreven, en krijgen ook de motoren de nodige instructies: momenteel heb ik het zo geprogrammeerd dat de motoren met twee snelheden kunnen draaien, zodat het ook mogelijk is om een flauwe bocht te maken.
Om de lengte van de pulsen te kennen in us, hoef je enkel de waardes op het LCD te vermenigvuldigen met tien.
De schakeling op het breadboard is vrij eenvoudig: de twee draden van de ontvanger sturen twee NPN transistors aan. Deze simuleren een drukschakelaar, zodat met de PULL-UP (3,9KOhm) weerstand de Vout aan te sturen is met een digitaal 1/0 signaal. De ontvanger is met de - en + ingeplugd in de uitbreidingsconnector, vervolgens zijn kanaal 7 en 8 via de de lange zwarte en rode draad met het breadboard verbonden.
!!!
Het kan zijn dat je zender niet ingesteld staat om de uiterste waardes te geven. Pas dit aan op je zender of in het progamma. Anders zal de puls minder variëren, bv. i.p.v. van 820us tot 1900us slechts van 1000us tot 1720us.
Nog met dank aan Francis van het Dwengo team voor de hulp bij het schrijven in C en het gratis vervangen van de motorcontroller.
#include <dwengoBoard.h>
#include <dwengoConfig.h>
#include <dwengoDelay.h>
#include <dwengoLCD.h>
#include <dwengoMotor.h>
#define B0 PORTBbits.RB0 //Ingangen doorverwijzen.
#define B1 PORTBbits.RB1
void main(void) {
int RC[2]; //Variabelen voor tijdsduur pulsen.
initBoard();
initLCD();
initMotor();
backlightOn();
printStringToLCD("Initializing...", 0, 0);
delay_s(3); //De ontvanger de tijd geven om op te starten.
while (TRUE) {
//Programma om lengte puls op B0 te meten.
while (B0 == 0) { //Indien aan.
}
while (B0 == 1) { //Indien uit.
}
while (B0 == 0) { //Indien aan.
RC[1]+=1;
delay_us(10);
}
//Programma om lengte puls op B1 te meten.
while (B1 == 0) { //Indien aan.
}
while (B1 == 1) { //Indien uit.
}
while (B1 == 0) { //Indien aan.
RC[2]+=1;
delay_us(10);
}
//Waardes naar LCD schrijven.
clearLCD();
printIntToLCD(RC[1], 0, 0);
printIntToLCD(RC[2], 0, 9);
//Besturing motor 1.
if (RC[1] > 166) {
if (RC[1] > 181) {
setSpeedMotor1(1023);
}
else {
setSpeedMotor1(600);
}
}
else if ((RC[1] < 167) && (RC[1] > 106)) {
setSpeedMotor1(0);
}
else if (RC[1] < 107) {
if (RC[1] < 92) {
setSpeedMotor1(-1023);
}
else {
setSpeedMotor1(-600);
}
}
//Besturing motor 2.
if (RC[2] > 166) {
if (RC[2] > 181) {
setSpeedMotor2(-1023);
}
else {
setSpeedMotor2(-600);
}
}
else if ((RC[2] < 167) && (RC[2] > 106)) {
setSpeedMotor2(0);
}
else if (RC[2] < 107) {
if (RC[2] < 92) {
setSpeedMotor2(1023);
}
else {
setSpeedMotor2(600);
}
}
//'RC' resetten op nul.
RC[1] = 0;
RC[2] = 0;
//Tijdsduur lus (verlaag voor een snellere reactietijd).
delay_ms(250);
}
}
Geen opmerkingen:
Een reactie posten