QQT912/新单片机-CW32L012/原项目程序/SW/12 CW32 BLDC haLL pid OK/USER/src/main.c

311 lines
7.7 KiB
C
Raw Normal View History

/*
21 2线
Designed by Cache.lee from UET company
Ported to CW32L012
*/
#include "main.h"
#include "motor.h"
#include "globalv.h"
#include "init.h"
#include "pid.h"
#include "compu.h"
#include "control.h"
unsigned int Menu = 0;
#define DEBUG_UARTx CW_UART3
#define DEBUG_UART_CLK SYSCTRL_APB1_PERIPH_UART3
#define DEBUG_UART_APBClkENx SYSCTRL_APBPeriphClk_Enable1
#define DEBUG_UART_BaudRate 115200
#define DEBUG_UART_UclkFreq 64000000
#define DEBUG_UART_GPIO_CLK SYSCTRL_AHB_PERIPH_GPIOB
#define DEBUG_UART_TX_GPIO_PORT CW_GPIOB
#define DEBUG_UART_TX_GPIO_PIN GPIO_PIN_6
#define DEBUG_UART_RX_GPIO_PORT CW_GPIOB
#define DEBUG_UART_RX_GPIO_PIN GPIO_PIN_7
#define DEBUG_UART_AFTX PB06_AFx_UART3TXD()
#define DEBUG_UART_AFRX PB07_AFx_UART3RXD()
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
void UART_Configuration(void)
{
UART_InitTypeDef UART_InitStructure = {0};
GPIO_InitTypeDef GPIO_InitStructure = {0};
SYSCTRL_AHBPeriphClk_Enable(DEBUG_UART_GPIO_CLK, ENABLE);
DEBUG_UART_APBClkENx(DEBUG_UART_CLK, ENABLE);
DEBUG_UART_AFTX;
DEBUG_UART_AFRX;
GPIO_InitStructure.Pins = DEBUG_UART_TX_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_Init(DEBUG_UART_TX_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pins = DEBUG_UART_RX_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
GPIO_Init(DEBUG_UART_RX_GPIO_PORT, &GPIO_InitStructure);
UART_InitStructure.UART_BaudRate = DEBUG_UART_BaudRate;
UART_InitStructure.UART_Over = UART_Over_16;
UART_InitStructure.UART_Source = UART_Source_PCLK;
UART_InitStructure.UART_UclkFreq = DEBUG_UART_UclkFreq;
UART_InitStructure.UART_StartBit = UART_StartBit_FE;
UART_InitStructure.UART_StopBits = UART_StopBits_1;
UART_InitStructure.UART_Parity = UART_Parity_No;
UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;
UART_Init(DEBUG_UARTx, &UART_InitStructure);
}
PUTCHAR_PROTOTYPE
{
UART_SendData(DEBUG_UARTx, (uint8_t)ch);
while (UART_GetFlagStatus(DEBUG_UARTx, UART_FLAG_TXE) == RESET)
{
}
return ch;
}
size_t __write(int handle, const unsigned char *buffer, size_t size)
{
size_t nChars = 0;
if (buffer == 0)
{
return 0;
}
if (handle != 1 && handle != 2)
{
return -1;
}
for (; size != 0; --size)
{
UART_SendData(DEBUG_UARTx, *buffer++);
while (UART_GetFlagStatus(DEBUG_UARTx, UART_FLAG_TXE) == RESET)
{
}
++nChars;
}
return nChars;
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
(void)file;
(void)line;
}
#endif
void PowerOnDelay(void)
{
unsigned int i;
for (i = 0; i < 6; i++)
{
volatile unsigned int j;
for (j = 0; j < 60000; j++)
{
}
}
KKN = (MAXSPEED - MINSPEED);
KKN = KKN / (NMAXVD - NMINVD);
}
unsigned int hte = 0;
int main(void)
{
unsigned char DZCount = 0;
char temp_buff[100], temp_buff1[50];
PowerOnDelay();
RCC_Configuration();
UART_Configuration();
GPIOInit();
LEDON();
ADC_Configuration();
PWMtimer_init();
BTIM_init();
Halltimer_init();
PWM_AL_ON;
PWM_BL_ON;
PWM_CL_ON;
TimeCountTemp = 0;
while (TimeCountTemp < 50)
{
}
TimeCountTemp = 0;
PWM_AL_OFF;
PWM_BL_OFF;
PWM_CL_OFF;
printf("Update %s %s\r\n", __DATE__, __TIME__);
printf("CW32L012 BLDC Hall PID\r\n");
printf("ADC[0]:%d ADC[1]:%d ADC[2]:%d ADC[3]:%d\r\n",
SampleData[0], SampleData[1], SampleData[2], SampleData[3]);
SampleVI();
startflag = 1;
EnDirCheck();
DIin = 0x500;
if (SampleData[1] > 1117 && SampleData[1] <= 1500)
{
DIin = SampleData[1];
}
else
{
printf("Current read err\r\n");
}
if (SampleData[2] > 3000 || SampleData[2] < 700)
{
printf("Speed read err\r\n");
}
if (HALL_Check() == 0 || HALL_Check() == 7)
{
printf("HALL Read Err\r\n");
}
if (CanshuV < 30)
{
printf("Votage read err\r\n");
}
sprintf(temp_buff1, "Set :%4d RPM ", SetSpeed);
sprintf(temp_buff, "Real:%4d RPM ", RealS);
printf("%s\r\n", temp_buff);
printf("%s\r\n", temp_buff1);
sprintf(temp_buff1, "Vbus :%d.%d V ", CanshuV / 10, CanshuV % 10);
sprintf(temp_buff, "I(MA):%d ", CanshuI);
printf("%s\r\n", temp_buff);
printf("%s\r\n", temp_buff1);
GPIO_WritePin(VOUT_EN_GPIO_PORT, VOUT_EN_GPIO_PIN, GPIO_Pin_SET);
while (1)
{
if (TimeCountCompuSpeed > 20)
{
TimeCountCompuSpeed = 0;
SampleSpeed();
HALL_Check();
}
if (TimeCountVI >= 200)
{
printf("ADC[0]:%d ADC[1]:%d ADC[2]:%d ADC[3]:%d\r\n",
SampleData[0], SampleData[1], SampleData[2], SampleData[3]);
TimeCountVI = 0;
SampleVI();
RealS = hte * 50 / MPolePairs;
if (MOTORSTATE == STATESTARTPID || MOTORSTATE == STATERUNPID)
{
if (RealS == 0)
{
DZCount++;
if (DZCount >= 10)
{
DZCount = 0;
ErrorCode = 7;
}
}
else
{
DZCount = 0;
}
}
}
if (ErrorCode != 0 && MOTORSTATE != STATEERROR && MOTORSTATE != STATEERROROVER)
{
MOTORSTATE = STATEERROR;
printf("ErrorCode=%d\r\n", ErrorCode);
GPIO_WritePin(VOUT_EN_GPIO_PORT, VOUT_EN_GPIO_PIN, GPIO_Pin_RESET);
}
if (TimeCountkey >= 500)
{
LEDTOG();
TimeCountkey = 0;
sprintf(temp_buff1, "Set :%4d RPM ", SetSpeed);
sprintf(temp_buff, "Real:%4d RPM ", RealS);
printf("%s\r\n", temp_buff);
printf("%s\r\n", temp_buff1);
sprintf(temp_buff1, "Vbus :%d.%d V ", CanshuV / 10, CanshuV % 10);
sprintf(temp_buff, "I(MA):%d ", CanshuI);
printf("%s\r\n", temp_buff);
printf("%s\r\n", temp_buff1);
}
MotorBreak();
EnDirCheck();
switch (MOTORSTATE)
{
case STATESTARTCHECK:
MotorStartCheck();
break;
case STATESTARTPID:
MotorStartPID();
break;
case STATERUNPID:
MotorRunPID();
break;
case STATESTOP:
MotorStop();
break;
case STATEERROR:
MotorError();
break;
case STATEERROROVER:
MotorErrorOver();
break;
default:
break;
}
}
}
void BTIM1_IRQHandler(void)
{
if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_UPDATE) != RESET)
{
BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_UPDATE);
TimeCountTemp++;
TimeCountCompuSpeed++;
TimeCountRealSpd++;
if (TimeCountAvgSpd >= 200)
{
hte = HALLcount1;
HALLcount1 = 0;
TimeCountAvgSpd = 0;
}
if (TimeCountRealSpd >= 20)
{
HALLcountTemp = HALLcount;
HALLcount = 0;
TimeCountRealSpd = 0;
}
TimeCountPID++;
TimeCountAvgSpd++;
TimeCountVI++;
TimeCountkey++;
}
}