Управление бесщеточным двигателем постоянного тока с использованием платы stm32f407 - PullRequest
0 голосов
/ 28 апреля 2019

Кстати, мне очень жаль моего английского, если я не могу правильно объяснить, что я делаю. Я делаю проект, который управляет бесколлекторным двигателем постоянного тока с помощью платы разработки stm32f407.

Сначала я управлял бесщеточным двигателем постоянного тока. с Arduino и наблюдаемым выводом ШИМ на экране осциллографа. Я понял, что бесщеточный двигатель постоянного тока не работает давая% 100 власти. Я понимаю, что мне нужно сделать мягкий старт, расширив рабочий цикл. Arduino отправляет сигнал ШИМ с частотой 50 Гц (период 20 мс) и рабочим циклом между минимальным% 10, максимальным% 12,5. Я написал код для stm, который управляет бесщеточным двигателем постоянного тока, используя pwm на выводе GPIOD12. Я установил настройки таймера7, поскольку генерировал прерывания каждые 1us и увеличивал счетчик в функции TIM7_IRQHandler (). Когда счетчик достигает номера 6410, он сбрасывается. Я определил переменную Duty, которая имеет значение 100 и увеличивается на 1 каждые 1 раз, пока не достигнет значения 240. В бесконечном цикле while, когда счетчик меньше 3 * Переменная Duty, устанавливается вывод GPIOD12. В диапазоне между 3 * рабочей переменной и значением 6410 вывод GPIO12 сброшен. Когда дежурная переменная увеличивается, ширина импульса увеличивается. Я пытаюсь плавно начать с использованием этого способа. Но я не могу управлять двигателем постоянного тока с помощью этого способа. Можете ли вы сказать мне, что я делаю не так?

#include "stm32f4xx.h"


void Timer7pwmGeneratorInit(void); //Timer7pwmGeneratorInit prototype
void SystemInitt(void); //SystemInitt prototype


int  Duty = 100; //Duty variable that represents duty cycle.
int i;       //Counter variable
long counter=0;  //counter variable

int main() {
Timer7pwmGeneratorInit(); //Timer7pwmGeneratorInit is called in main/                                                                                     SystemInitt();        //SystemInitt is called in main

while(1) { 

if(counter < ( 3 * Duty)){ 
GPIOD->ODR |= (0x1000); } //When counter is smaller than 3*Dutyvariable,set GPIOD12 pin.

else if( counter > ( 3 * Duty) && counter < 6410) 

{GPIOD-> ODR & = ~ (0x1000); // Когда счетчик находится между значением 3 * Duty и 6410, счетчик сбрасывается. }

}

}

void Timer7pwmGeneratorInit(void){

RCC->APB1ENR|=0x00000020;       // Timer7 clock is activated(84 Mhz)
TIM7->CR1=0x0080;               // Automatic Reload

/*********Timer 7  frequency --> fCK_PSC / (Loaded Value + 1) 84E6 / (42) = 2000 KHz**************/

TIM7->PSC =41;   // Prescaler value is 41, Counting frequency = fCK_PSC /    (Loaded Value + 1) 84E6 / (42) = 2000 KHz
TIM7->ARR =1;                   // When counter is equals to 1,returns.    Timer interrupt is generated every 1 uS
TIM7->DIER=0x0001;              // Update Int enable
NVIC->ISER[1] = 0X00800000;     // NVIC de Timer 7 interrupta is enabled
TIM7->CR1 |= 0x0001;            // Counter Enabled

}

void TIM7_IRQHandler(){
TIM7->SR=0;  //Timer 7 status register is resetted
counter++;  //counter is incremented by 1
if(counter>=6410) //When counter is equals to 6410,counter is                 resetted.
counter=0;
if(Duty < 240) {  duty is smaller than 240, increase duty by 1.
Duty = Duty + 1; //increase duty by 1.}

}

void SystemInitt(void){
unsigned int i;

for (i=0;i<0x00100000;i++);      
RCC->CFGR |= 0x00009400;        // AHB ve APB speeds are setted max value
RCC->CR |= 0x00010000;          // HSE Xtal osc start to work       
while (!(RCC->CR & 0x00020000));// Xtal osc get stabilized
RCC->PLLCFGR = 0x07402A04;      // PLL coefficients M = 4, N = 168, P = 2 and Q = 7   168 Mhz 
RCC->CR |= 0x01000000;          // PLL starts  (Rehber Sayfa 95)
while(!(RCC->CR & 0x02000000)); // Wait until PLL is ready
FLASH->ACR = 0x00000605;        // 5 Wait state was selected for Flash ROM and ART is activated. (Rehber Sayfa 55)
RCC->CFGR |= 0x00000002;        // System Clk feed through PLL
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Wait till feeds
RCC->AHB1ENR |= (1UL << 3);          // Clock Signal Active for Port D
GPIOD->MODER |= 0x01000000; // output pin for LED D12
GPIOD->OSPEEDR |= (2UL << 0);   // GPIO Port Output Speed(High)
GPIOD->PUPDR &= ~(3UL << 0);       // No Pull-Up Pull-Down for PD0

}

1 Ответ

0 голосов
/ 28 апреля 2019

Stm32f4 имеет хорошие библиотечные функции, и я рекомендую вам программировать библиотечными функциями вместо непосредственного чтения и записи регистров, что не имеет значения. Нет возможности прочитать этот вопрос, потому что никто не знает, какие регистры вы пишете, и я должен проверить руководство. Если вы китаец, вы можете задать этот вопрос на домашней «"子» BBS, если вы считаете, что с кодом нет проблем, вы можете проверить аппаратное обеспечение, такое как питание этого двигателя, при включенном питании. плата не может двигаться.

...