#include <NUC029xAN.h>
#include <stdio.h>
#include <stdint.h>
void sys_init(void) {
SYS_UnlockReg();
CLK_EnableModuleClock(CLK_PWRCON_XTL12M_EN_Msk);
CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);
CLK_EnablePLL(CLK_PLLCON_PLL_SRC_HXT, FREQ_100MHZ);
CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk);
CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_PLL, CLK_CLKDIV_HCLK(2));
SystemCoreClockUpdate();
}
void led_init(void) {
SYS->P3_MFP &= ~(SYS_MFP_P32_Msk | SYS_MFP_P33_Msk | SYS_MFP_P34_Msk | SYS_MFP_P35_Msk);
SYS->P3_MFP |= SYS_MFP_P32_GPIO | SYS_MFP_P33_GPIO | SYS_MFP_P34_GPIO | SYS_MFP_P35_GPIO;
GPIO_SetMode(P3, BIT2 | BIT3 | BIT4 | BIT5, GPIO_PMD_OUTPUT);
}
void acmp_init(void) {
SYS->P1_MFP &= ~(SYS_MFP_P14_Msk | SYS_MFP_P15_Msk | SYS_MFP_P16_Msk | SYS_MFP_P17_Msk);
SYS->P1_MFP |= SYS_MFP_P14_ACMP0_N | SYS_MFP_P15_ACMP0_P | SYS_MFP_P16_ACMP2_N | SYS_MFP_P17_ACMP2_P;
SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
SYS->P3_MFP |= SYS_MFP_P30_ACMP1_N | SYS_MFP_P31_ACMP1_P;
GPIO_DISABLE_DIGITAL_PATH(P1, BIT4 | BIT5 | BIT6 | BIT7);
GPIO_DISABLE_DIGITAL_PATH(P3, BIT0 | BIT1);
CLK_EnableModuleClock(ACMP01_MODULE);
CLK_EnableModuleClock(ACMP23_MODULE);
ACMP_Open(ACMP01, 0, ACMP_CR_VNEG_PIN, ACMP_CR_HYSTERESIS_ENABLE);
ACMP_Open(ACMP01, 1, ACMP_CR_VNEG_PIN, ACMP_CR_HYSTERESIS_ENABLE);
ACMP_Open(ACMP23, 2, ACMP_CR_VNEG_PIN, ACMP_CR_HYSTERESIS_ENABLE);
}
void pwm_init(void) {
SYS->P2_MFP &= ~(SYS_MFP_P20_Msk | SYS_MFP_P21_Msk | SYS_MFP_P22_Msk | SYS_MFP_P23_Msk | SYS_MFP_P24_Msk | SYS_MFP_P25_Msk);
SYS->P2_MFP |= SYS_MFP_P20_PWM0 | SYS_MFP_P21_PWM1 | SYS_MFP_P22_PWM2 | SYS_MFP_P23_PWM3 | SYS_MFP_P24_PWM4 | SYS_MFP_P25_PWM5;
GPIO_SetMode(P2, BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5, GPIO_PMD_OUTPUT);
P20 = 0; P21 = 0; P22 = 0; P23 = 0; P24 = 0; P25 = 0;
CLK_EnableModuleClock(PWM01_MODULE);
CLK_EnableModuleClock(PWM23_MODULE);
CLK_EnableModuleClock(PWM45_MODULE);
CLK_SetModuleClock(PWM01_MODULE, CLK_CLKSEL1_PWM01_S_HCLK, 0);
CLK_SetModuleClock(PWM23_MODULE, CLK_CLKSEL1_PWM23_S_HCLK, 0);
CLK_SetModuleClock(PWM45_MODULE, CLK_CLKSEL2_PWM45_S_HCLK, 0);
PWMA->PPR = (10 << PWM_PPR_DZI23_Pos) | (10 << PWM_PPR_DZI01_Pos) | (1 << PWM_PPR_CP23_Pos) | (1 << PWM_PPR_CP01_Pos);
PWMB->PPR = (10 << PWM_PPR_DZI01_Pos) | (1 << PWM_PPR_CP01_Pos);
PWMA->CSR = (4 << PWM_CSR_CSR2_Pos) | (4 << PWM_CSR_CSR0_Pos);
PWMB->CSR = (4 << PWM_CSR_CSR0_Pos);
PWMA->PCR = PWM_PCR_PWM23TYPE_Msk | PWM_PCR_PWM01TYPE_Msk | PWM_PCR_CH2MOD_Msk | PWM_PCR_CH0MOD_Msk | PWM_PCR_DZEN23_Msk | PWM_PCR_DZEN01_Msk;
PWMB->PCR = PWM_PCR_PWM01TYPE_Msk | PWM_PCR_CH0MOD_Msk | PWM_PCR_DZEN01_Msk;
PWMA->CMR0 = 250;
PWMA->CMR2 = 250;
PWMB->CMR0 = 250;
PWMA->CNR0 = 500;
PWMA->CNR2 = 500;
PWMB->CNR0 = 500;
PWMA->POE = PWM_POE_PWM3_Msk | PWM_POE_PWM2_Msk | PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk;
PWMB->POE = PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk;
PWMA->PSCR = PWM_PSCR_PSSEN2_Msk | PWM_PSCR_PSSEN0_Msk;
PWMB->PSCR = PWM_PSCR_PSSEN0_Msk;
PWMA->PCR |= PWM_PCR_CH0EN_Msk;
}
void ah(int32_t duty) {
PWMB->POE |= PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk;
PWMB->CMR0 = 250 - duty;
}
void al(int32_t duty) {
PWMB->POE |= PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk;
PWMB->CMR0 = 250 + duty;
}
void az(void) {
PWMB->POE &= ~(PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk);
}
void bh(int32_t duty) {
PWMA->POE |= PWM_POE_PWM3_Msk | PWM_POE_PWM2_Msk;
PWMA->CMR2 = 250 - duty;
}
void bl(int32_t duty) {
PWMA->POE |= PWM_POE_PWM3_Msk | PWM_POE_PWM2_Msk;
PWMA->CMR2 = 250 + duty;
}
void bz(void) {
PWMA->POE &= ~(PWM_POE_PWM3_Msk | PWM_POE_PWM2_Msk);
}
void ch(int32_t duty) {
PWMA->POE |= PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk;
PWMA->CMR0 = 250 - duty;
}
void cl(int32_t duty) {
PWMA->POE |= PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk;
PWMA->CMR0 = 250 + duty;
}
void cz(void) {
PWMA->POE &= ~(PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk);
}
int32_t wait_ap(volatile int32_t t) {
int32_t i;
P32 = 0;
for ( ; t; t--) {
if (0 == ACMP_GET_OUTPUT(ACMP01, 1)) {
continue;
}
for (i = 100; i; i--) {
if (0 == ACMP_GET_OUTPUT(ACMP01, 1)) {
break;
}
}
if (0 == i) {
P32 = 1;
break;
}
}
return t;
}
int32_t wait_an(volatile int32_t t) {
int32_t i;
P32 = 0;
for ( ; t; t--) {
if (1 == ACMP_GET_OUTPUT(ACMP01, 1)) {
continue;
}
for (i = 100; i; i--) {
if (1 == ACMP_GET_OUTPUT(ACMP01, 1)) {
break;
}
}
if (0 == i) {
P32 = 1;
break;
}
}
return t;
}
int32_t wait_bp(volatile int32_t t) {
int32_t i;
P33 = 0;
for ( ; t; t--) {
if (0 == ACMP_GET_OUTPUT(ACMP23, 2)) {
continue;
}
for (i = 100; i; i--) {
if (0 == ACMP_GET_OUTPUT(ACMP23, 2)) {
break;
}
}
if (0 == i) {
P33 = 1;
break;
}
}
return t;
}
int32_t wait_bn(volatile int32_t t) {
int32_t i;
P33 = 0;
for ( ; t; t--) {
if (1 == ACMP_GET_OUTPUT(ACMP23, 2)) {
continue;
}
for (i = 100; i; i--) {
if (1 == ACMP_GET_OUTPUT(ACMP23, 2)) {
break;
}
}
if (0 == i) {
P33 = 1;
break;
}
}
return t;
}
int32_t wait_cp(volatile int32_t t) {
int32_t i;
P34 = 0;
for ( ; t; t--) {
if (0 == ACMP_GET_OUTPUT(ACMP01, 0)) {
continue;
}
for (i = 100; i; i--) {
if (0 == ACMP_GET_OUTPUT(ACMP01, 0)) {
break;
}
}
if (0 == i) {
P34 = 1;
break;
}
}
return t;
}
int32_t wait_cn(volatile int32_t t) {
int32_t i;
P34 = 0;
for ( ; t; t--) {
if (1 == ACMP_GET_OUTPUT(ACMP01, 0)) {
continue;
}
for (i = 100; i; i--) {
if (1 == ACMP_GET_OUTPUT(ACMP01, 0)) {
break;
}
}
if (0 == i) {
P34 = 1;
break;
}
}
return t;
}
void bldc_run(void) {
int32_t t = 50000, duty = 10;
for ( ; ; ) {
cz();
bl(duty);
wait_cp(t); // 1 0 z
t -= (t >> 12);
az();
ch(duty);
wait_an(t); // z 0 1
t -= (t >> 12);
bz();
al(duty);
wait_bp(t); // 0 z 1
t -= (t >> 12);
cz();
bh(duty);
wait_cn(t); // 0 1 z
t -= (t >> 12);
az();
cl(duty);
wait_ap(t); // z 1 0
t -= (t >> 12);
bz();
ah(duty);
wait_bn(t); // 1 z 0
t -= (t >> 12);
if (duty < 60) {
duty++;
}
}
}
int main(void) {
sys_init();
led_init();
acmp_init();
pwm_init();
bldc_run();
return 0;
}
最近编辑记录 bunny (2020-06-05 20:30:16)
离线
离线
离线
精简一下代码
#include <NUC029xAN.h>
#include <stdio.h>
#include <stdint.h>
void sys_init(void) {
SYS_UnlockReg();
CLK_EnableModuleClock(CLK_PWRCON_XTL12M_EN_Msk);
CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);
CLK_EnablePLL(CLK_PLLCON_PLL_SRC_HXT, FREQ_100MHZ);
CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk);
CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_PLL, CLK_CLKDIV_HCLK(2));
SystemCoreClockUpdate();
}
void led_init(void) {
SYS->P3_MFP &= ~(SYS_MFP_P32_Msk | SYS_MFP_P33_Msk | SYS_MFP_P34_Msk | SYS_MFP_P35_Msk);
SYS->P3_MFP |= SYS_MFP_P32_GPIO | SYS_MFP_P33_GPIO | SYS_MFP_P34_GPIO | SYS_MFP_P35_GPIO;
GPIO_SetMode(P3, BIT2 | BIT3 | BIT4 | BIT5, GPIO_PMD_OUTPUT);
}
void acmp_init(void) {
SYS->P1_MFP &= ~(SYS_MFP_P14_Msk | SYS_MFP_P15_Msk | SYS_MFP_P16_Msk | SYS_MFP_P17_Msk);
SYS->P1_MFP |= SYS_MFP_P14_ACMP0_N | SYS_MFP_P15_ACMP0_P | SYS_MFP_P16_ACMP2_N | SYS_MFP_P17_ACMP2_P;
SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
SYS->P3_MFP |= SYS_MFP_P30_ACMP1_N | SYS_MFP_P31_ACMP1_P;
GPIO_DISABLE_DIGITAL_PATH(P1, BIT4 | BIT5 | BIT6 | BIT7);
GPIO_DISABLE_DIGITAL_PATH(P3, BIT0 | BIT1);
CLK_EnableModuleClock(ACMP01_MODULE);
CLK_EnableModuleClock(ACMP23_MODULE);
ACMP_Open(ACMP01, 0, ACMP_CR_VNEG_PIN, ACMP_CR_HYSTERESIS_ENABLE);
ACMP_Open(ACMP01, 1, ACMP_CR_VNEG_PIN, ACMP_CR_HYSTERESIS_ENABLE);
ACMP_Open(ACMP23, 2, ACMP_CR_VNEG_PIN, ACMP_CR_HYSTERESIS_ENABLE);
}
void pwm_init(void) {
SYS->P2_MFP &= ~(SYS_MFP_P20_Msk | SYS_MFP_P21_Msk | SYS_MFP_P22_Msk | SYS_MFP_P23_Msk | SYS_MFP_P24_Msk | SYS_MFP_P25_Msk);
SYS->P2_MFP |= SYS_MFP_P20_PWM0 | SYS_MFP_P21_PWM1 | SYS_MFP_P22_PWM2 | SYS_MFP_P23_PWM3 | SYS_MFP_P24_PWM4 | SYS_MFP_P25_PWM5;
GPIO_SetMode(P2, BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5, GPIO_PMD_OUTPUT);
P20 = 0; P21 = 0; P22 = 0; P23 = 0; P24 = 0; P25 = 0;
CLK_EnableModuleClock(PWM01_MODULE);
CLK_EnableModuleClock(PWM23_MODULE);
CLK_EnableModuleClock(PWM45_MODULE);
CLK_SetModuleClock(PWM01_MODULE, CLK_CLKSEL1_PWM01_S_HCLK, 0);
CLK_SetModuleClock(PWM23_MODULE, CLK_CLKSEL1_PWM23_S_HCLK, 0);
CLK_SetModuleClock(PWM45_MODULE, CLK_CLKSEL2_PWM45_S_HCLK, 0);
PWMA->PPR = (10 << PWM_PPR_DZI23_Pos) | (10 << PWM_PPR_DZI01_Pos) | (1 << PWM_PPR_CP23_Pos) | (1 << PWM_PPR_CP01_Pos);
PWMB->PPR = (10 << PWM_PPR_DZI01_Pos) | (1 << PWM_PPR_CP01_Pos);
PWMA->CSR = (4 << PWM_CSR_CSR2_Pos) | (4 << PWM_CSR_CSR0_Pos);
PWMB->CSR = (4 << PWM_CSR_CSR0_Pos);
PWMA->PCR = PWM_PCR_PWM23TYPE_Msk | PWM_PCR_PWM01TYPE_Msk | PWM_PCR_CH2MOD_Msk | PWM_PCR_CH0MOD_Msk | PWM_PCR_DZEN23_Msk | PWM_PCR_DZEN01_Msk;
PWMB->PCR = PWM_PCR_PWM01TYPE_Msk | PWM_PCR_CH0MOD_Msk | PWM_PCR_DZEN01_Msk;
PWMA->CMR0 = 250;
PWMA->CMR2 = 250;
PWMB->CMR0 = 250;
PWMA->CNR0 = 500;
PWMA->CNR2 = 500;
PWMB->CNR0 = 500;
PWMA->POE = PWM_POE_PWM3_Msk | PWM_POE_PWM2_Msk | PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk;
PWMB->POE = PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk;
PWMA->PSCR = PWM_PSCR_PSSEN2_Msk | PWM_PSCR_PSSEN0_Msk;
PWMB->PSCR = PWM_PSCR_PSSEN0_Msk;
PWMA->PCR |= PWM_PCR_CH0EN_Msk;
}
void ah(int32_t duty) {
PWMB->POE |= PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk;
PWMB->CMR0 = 250 - duty;
}
void al(int32_t duty) {
PWMB->POE |= PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk;
PWMB->CMR0 = 250 + duty;
}
void az(void) {
PWMB->POE &= ~(PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk);
}
void bh(int32_t duty) {
PWMA->POE |= PWM_POE_PWM3_Msk | PWM_POE_PWM2_Msk;
PWMA->CMR2 = 250 - duty;
}
void bl(int32_t duty) {
PWMA->POE |= PWM_POE_PWM3_Msk | PWM_POE_PWM2_Msk;
PWMA->CMR2 = 250 + duty;
}
void bz(void) {
PWMA->POE &= ~(PWM_POE_PWM3_Msk | PWM_POE_PWM2_Msk);
}
void ch(int32_t duty) {
PWMA->POE |= PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk;
PWMA->CMR0 = 250 - duty;
}
void cl(int32_t duty) {
PWMA->POE |= PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk;
PWMA->CMR0 = 250 + duty;
}
void cz(void) {
PWMA->POE &= ~(PWM_POE_PWM1_Msk | PWM_POE_PWM0_Msk);
}
int32_t wait_a_pn(volatile int32_t t, int32_t pn) {
int32_t i;
P32 = 0;
for ( ; t; t--) {
if (pn != ACMP_GET_OUTPUT(ACMP01, 1)) {
continue;
}
for (i = 100; i; i--) {
if (pn != ACMP_GET_OUTPUT(ACMP01, 1)) {
break;
}
}
if (0 == i) {
P32 = 1;
break;
}
}
return t;
}
int32_t wait_b_pn(volatile int32_t t, int32_t pn) {
int32_t i;
P33 = 0;
for ( ; t; t--) {
if (pn != ACMP_GET_OUTPUT(ACMP23, 2)) {
continue;
}
for (i = 100; i; i--) {
if (pn != ACMP_GET_OUTPUT(ACMP23, 2)) {
break;
}
}
if (0 == i) {
P33 = 1;
break;
}
}
return t;
}
int32_t wait_c_pn(volatile int32_t t, int32_t pn) {
int32_t i;
P34 = 0;
for ( ; t; t--) {
if (pn != ACMP_GET_OUTPUT(ACMP01, 0)) {
continue;
}
for (i = 100; i; i--) {
if (pn != ACMP_GET_OUTPUT(ACMP01, 0)) {
break;
}
}
if (0 == i) {
P34 = 1;
break;
}
}
return t;
}
void bldc_run(void) {
int32_t t = 50000, duty = 10;
for ( ; ; ) {
cz();
bl(duty);
wait_c_pn(t, 1); // 1 0 z
t -= (t >> 12);
az();
ch(duty);
wait_a_pn(t, 0); // z 0 1
t -= (t >> 12);
bz();
al(duty);
wait_b_pn(t, 1); // 0 z 1
t -= (t >> 12);
cz();
bh(duty);
wait_c_pn(t, 0); // 0 1 z
t -= (t >> 12);
az();
cl(duty);
wait_a_pn(t, 1); // z 1 0
t -= (t >> 12);
bz();
ah(duty);
wait_b_pn(t, 0); // 1 z 0
t -= (t >> 12);
if (duty < 60) {
duty++;
}
}
}
int main(void) {
sys_init();
led_init();
acmp_init();
pwm_init();
bldc_run();
return 0;
}
离线
这个梯形是自感电动势?
离线
好贵的示波器~~
DS5022ME 飘过
离线
15元访真器到了.明天点灯.
离线