Этот вопрос задается после этой темы:
Проблема объявления методов и параметров в классе с заголовком
Я пытался решить эту следующую проблему, но безуспешно.
Я использую Raspberry Pi с C ++ и пытаюсь реализовать элемент управления GPIO через класс.
Поэтому у меня есть:
- мой основной cpp файл, в котором я вызываю объект (он работает, я в этом уверен, вы увидите) с именем "RobotControl03. cpp"
- файл класса cpp с именем "Motorcontrol01. cpp "
- заголовочный файл с именем" Motorcontrol01.h "
Моя цель здесь состоит в том, чтобы просто вызвать" while (1) "l oop, где состояния выходов GPIO существенно меняется только для целей тестирования. Я проверяю выход через мой осциллограф;)
Проблема в том, что он, по-видимому, работает правильно, показывает, что ожидается на экране (см. Снимок экрана внизу), но выходные контакты постоянно остаются на 0 В. : '(
Я пробовал несколько модификаций, но ничего не получалось ...
Мой код более сложен, чем то, что я здесь показываю, но я упростил его для целей тестирования, и он все равно не работает -_-
Основной файл называется "RobotControl03. cpp":
#include <iostream> //for Cout to display stuff
#include <cstdio>
#include <csignal>
#include <ctime>
#include <vector> //for using vectors instead of arrays
#include <chrono> //library for counting time
#include <thread> //for multithreading
#include <termios.h>
#include <wiringPi.h> //Raspberry pi GPIO Library
#include "RPMCounter01.h"
#include "MotorControl01.h" //looking in current dirrectory
bool RUNNING = true; // global flag used to exit from the main loop
//###################################################################################
// GPIO Pins definition
//###################################################################################
//int SPser = 13, SPclk = 19, SPrclk = 26; //Define the output pins used
int Motor0In = 17; //define the input pins used
int Motor1In = 18; //define the input pins used
/*int SPser = 13;
int SPclk = 19;
int SPrclk = 26; //Define the output pins used for the main shift registers
int PWMSPclk = 6;
int PWMSPrclk = 12; */
//###################################################################################
// The array in which the different pins values will be stored
//###################################################################################
std::vector<std::vector<bool>> DataArr(16,std::vector<bool>(8, 0)); //create the array of data for the shift register. Each vector is of 8 values for the shift registers of the PWM control
//direction 0 = forward, 1 = backward. PWM = 0 is stop, over, it runs
/* 0 = Direction | Motor 1 8 =
* 1 = PWM | Motor 1 9 =
* 2 = Direction ] Motor2 10 =
* 3 = PWM ] Motor2 11 =
* 4 = 12 =
* 5 = 13 =
* 6 = 14 =
* 7 = 15 =
*/
int M0Speed = 0;
std::vector<bool> M0SpeedBin(8, 0); //Binary value of the motor speed
int M1Speed = 0;
std::vector<bool> M1SpeedBin(8, 0);
//###################################################################################
// Callback handler if CTRL-C signal is detected
//###################################################################################
void my_handler(int s)
{
std::cout << "Detected CTRL-C signal no. " << s << '\n';
RUNNING = false;
}
//###################################################################################
// MAIN
//###################################################################################
int main()
{
// Initialize wiringPi and allow the use of BCM pin numbering
/*wiringPiSetupGpio();
pinMode(SPser, OUTPUT);
pinMode(SPclk, OUTPUT);
pinMode(SPrclk, OUTPUT);
pinMode(PWMSPclk, OUTPUT);
pinMode(PWMSPrclk, OUTPUT);*/
// Register a callback function to be called if the user presses CTRL-C
std::signal(SIGINT, my_handler);
MotorControl pouet; //Create an object, calling it pouet
std::cout << "calling SendDataPWM " << '\n';
pouet.SendDataPWM(DataArr); //calling the method of the object
}
Заголовочный файл называется "MotorControl01. cpp"
//###################################################################################
// Class for creating the different shift register entry data
//###################################################################################
#include <iostream> //for Cout to display stuff
#include <chrono> //library for counting time
#include <thread> //for multithreading
#include <vector>
#include <wiringPi.h> //Raspberry pi GPIO Library
#include "MotorControl01.h" //looking in current dirrectory
MotorControl::MotorControl(){ //constructeur
//std::vector<std::vector<bool>> MCDataArr(16, std::vector<bool>(8, 0)); //the vector of vectors with boolean values in it for transmitting the motors control data
//mFrequency = 0;
//mGPIOOutputNb = 0;
//###################################################################################
// GPIO Pins definition
//###################################################################################
SPser = 13;
SPclk = 19;
SPrclk = 26; //Define the output pins used for the main shift registers
PWMSPclk = 6;
PWMSPrclk = 12; // define the output pins to control the PWM shift registers
}
void MotorControl::SendDataPWM(std::vector<std::vector<bool>> MCDataArr){
// Initialize wiringPi and allow the use of BCM pin numbering
wiringPiSetupGpio();
//initialize the pins
pinMode(SPser, OUTPUT);
pinMode(SPclk, OUTPUT);
pinMode(SPrclk, OUTPUT);
pinMode(PWMSPclk, OUTPUT);
pinMode(PWMSPrclk, OUTPUT);
// copy the data of the received vecor to preserve it
//std::vector<std::vector<bool>> EditDataArr(16, std::vector<bool>(8, 0));
//EditDataArr = DataArr;
while (1) {
digitalWrite(PWMSPclk, HIGH); //after looping through every value, ticking the register to load everything on the output of the main registers
digitalWrite(PWMSPclk, LOW);
std::cout << "PWM SP CLK"<< PWMSPclk <<'\n';
digitalWrite(PWMSPrclk, HIGH); //after looping through every value, ticking the register to load everything on the output of the PWM registers
digitalWrite(PWMSPrclk, LOW);
std::cout << "PWM SP R CLK"<< PWMSPrclk <<'\n';
digitalWrite(SPclk, HIGH); //after looping through every value, ticking the register to load everything on the output of the main registers
digitalWrite(SPclk, LOW);
std::cout << "SP CLK"<< SPclk<<'\n';
digitalWrite(SPrclk, HIGH); //after looping through every value, ticking the register to load everything on the output of the PWM registers
digitalWrite(SPrclk, LOW);
std::cout << "SP R CLK"<< SPrclk<<'\n';
}
}
И красивый заголовочный файл, который идет вместе с ним:
#ifndef DEF_MotorControl
#define DEF_MotorControl
#include <vector>
class MotorControl{
public:
MotorControl(); //Constructeur
void SendDataPWM(std::vector<std::vector<bool>> MCDataArr);
private:
//std::vector<std::vector<bool>> MCDataArr;
int mFrequency;
int mGPIOOutputNb;
int SPser;
int SPclk;
int SPrclk; //Define the output pins used for the main shift registers
int PWMSPclk;
int PWMSPrclk;
};
#endif
Вот результат командной строки:
Я надеюсь, что я надену не нужно показывать изображение осциллографа, на котором ничего не изображено;)
Редактировать:
Для тех, кто думает, что установка порта GPIO «вкл», а затем напрямую «выкл», не дает времени чтобы достичь уровня, я делаю это с самого начала, вот ожидаемый результат:
Я смог отлично управлять сдвиговым регистром с ним. Только после того, как я поместил свой код в отдельные файлы, он больше не работает: (
Спасибо за вашу помощь!
РЕДАКТИРОВАТЬ 2:
У меня есть в код добавлено несколько снов:
digitalWrite(PWMSPclk, HIGH);
sleep(1);
digitalWrite(PWMSPclk, LOW);
sleep(1);
std::cout << "PWM SP CLK"<< PWMSPclk <<'\n';
}
digitalWrite(PWMSPrclk, HIGH);
sleep(1);
digitalWrite(PWMSPrclk, LOW);
sleep(1);
std::cout << "PWM SP R CLK"<< PWMSPrclk <<'\n';
digitalWrite(SPclk, HIGH);
sleep(1);
digitalWrite(SPclk, LOW);
sleep(1);
std::cout << "SP CLK"<< SPclk<<'\n';
digitalWrite(SPrclk, HIGH);
sleep(1);
digitalWrite(SPrclk, LOW);
sleep(1);
std::cout << "SP R CLK"<< SPrclk<<'\n';
Я перебрал только один из сигналов, он дает что-то вроде этого:
while (1) {
//using namespace std::chrono;
//CDelTime = 1ns; // interval at which a pin is turned HIGH/LOW
digitalWrite(PWMSPclk, HIGH); //after looping through every value, ticking the register to load everything on the output of the main registers
//sleep(1);
digitalWrite(PWMSPclk, LOW);
//sleep(1);
std::cout << "PWM SP CLK"<< PWMSPclk <<'\n';
}
откуда берется эта задержка 6-7 мкс?