311 lines
7.7 KiB
C
311 lines
7.7 KiB
C
/*
|
||
2页菜单:1:设定速度、实时速度; 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++;
|
||
}
|
||
}
|