电调解锁方法
2ms高电平的pwm波,400hz,持续5s以上
1ms高电平的pwm波,持续2s
即可解锁,之后输入1-2ms范围的高电平的pwm波即可控制电机的转速
这里是主函数
#include "stdio.h"
#include <stdint.h>
#include <stdbool.h>
#include "hw_memmap.h"
#include "hw_types.h"
#include "hw_gpio.h"
#include "debug.h"
#include "fpu.h"
#include "gpio.h"
#include "pin_map.h"
#include "rom.h"
#include "sysctl.h"
#include "uart.h"
#include "uartstdio.h"
#include "SystickTime.h"
#include "wpwm.h"
#ifdef DEBUG
void
__error__(char *pcFilename, uint32_t ui32Line)
{
}
#endif
void PrintfLogo(void)
{
printf("*************************************************************\n\r");
printf("* 例程名称 : %s\r\n", "基于滴答定时器的精准延时");
printf("* 例程版本 : %s\r\n", "V1.0");
printf("* 发布日期 : %s\r\n", "20200310");
printf("* 标准库版本 :TM4C123GH6PM\r\n");
printf("* \r\n");
printf("* QQ : 3138372165 \r\n");
printf("* Email : 3138372165@qq.com \r\n");
printf("* Copyright www.nameless.tech 无名创新\r\n");
printf("*************************************************************\n\r");
}
void ConfigureUART(void)
{
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTStdioConfig(0, 115200, 16000000);UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
}
int fputc(int ch, FILE *f){UARTCharPut(UART0_BASE,ch); return (ch);}
int fgetc(FILE *f) {int ch=UARTCharGet(UART0_BASE); return (ch);}
int main(void)
{
ROM_FPULazyStackingEnable();
ROM_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;
HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x000000FF;
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_2);
GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_2,0);
initTime();
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_3);
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1);
ConfigureUART();
PrintfLogo();
Init_PWM();
PWM_Output(2000,2000,2000,2000);
delay_ms(5000);
PWM_Output(1000,1000,1000,1000);
delay_ms(2000);
PWM_Output(1200,1200,1200,1200);
while(1)
{
printf("%d\r\n",PWMGenPeriodGet(PWM0_BASE, PWM_GEN_0));
printf("%d\r\n",PWMGenPeriodGet(PWM0_BASE, PWM_GEN_1));
printf("%d\r\n",PWMGenPeriodGet(PWM0_BASE, PWM_GEN_2));
printf("%d\r\n",PWMGenPeriodGet(PWM0_BASE, PWM_GEN_3));
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);
delay_ms(100);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
delay_ms(100);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0);
delay_ms(100);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_PIN_3);
delay_ms(100);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0);
delay_ms(100);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);
delay_ms(100);
}
}
pwm模块的函数(这一段程序来自于无名飞控
#include "wpwm.h"
#define PWM_PERIOD_MAX 3125
#define PWM_PERIOD_MAX_20MS (5000*8)
static uint16_t period;
void Init_PWM(void)
{
SysCtlPWMClockSet(SYSCTL_PWMDIV_64);
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);
SysCtlDelay(2);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
SysCtlDelay(2);
GPIOPinConfigure(GPIO_PB6_M0PWM0);
GPIOPinConfigure(GPIO_PB7_M0PWM1);
GPIOPinConfigure(GPIO_PB4_M0PWM2);
GPIOPinConfigure(GPIO_PB5_M0PWM3);
GPIOPinConfigure(GPIO_PE4_M0PWM4);
GPIOPinConfigure(GPIO_PE5_M0PWM5);
GPIOPinConfigure(GPIO_PC4_M0PWM6);
GPIOPinConfigure(GPIO_PC5_M0PWM7);
GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_6);
GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_7);
GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_4);
GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_5);
GPIOPinTypePWM(GPIO_PORTE_BASE, GPIO_PIN_4);
GPIOPinTypePWM(GPIO_PORTE_BASE, GPIO_PIN_5);
GPIOPinTypePWM(GPIO_PORTC_BASE, GPIO_PIN_4);
GPIOPinTypePWM(GPIO_PORTC_BASE, GPIO_PIN_5);
PWMGenConfigure(PWM0_BASE, PWM_GEN_0, PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenConfigure(PWM0_BASE, PWM_GEN_1, PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenConfigure(PWM0_BASE, PWM_GEN_2, PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenConfigure(PWM0_BASE, PWM_GEN_3, PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
period = PWM_PERIOD_MAX;
PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, period);
PWMGenPeriodSet(PWM0_BASE, PWM_GEN_1, period);
PWMGenPeriodSet(PWM0_BASE, PWM_GEN_2, period);
PWMGenPeriodSet(PWM0_BASE, PWM_GEN_3, period);
PWMGenEnable(PWM0_BASE, PWM_GEN_0);
PWMGenEnable(PWM0_BASE, PWM_GEN_1);
PWMGenEnable(PWM0_BASE, PWM_GEN_2);
PWMGenEnable(PWM0_BASE, PWM_GEN_3);
PWMOutputState(PWM0_BASE, PWM_OUT_0_BIT | PWM_OUT_1_BIT | PWM_OUT_2_BIT | PWM_OUT_3_BIT
| PWM_OUT_4_BIT | PWM_OUT_5_BIT | PWM_OUT_6_BIT | PWM_OUT_7_BIT,
true);
PWM_Output(1000,1000,1000,1000);
}
void PWM_Output(uint16_t width1,uint16_t width2,uint16_t width3,uint16_t width4)
{
PWMPulseWidthSet(PWM0_BASE,PWM_OUT_6,1.25*width1);
PWMPulseWidthSet(PWM0_BASE,PWM_OUT_7,1.25*width2);
PWMPulseWidthSet(PWM0_BASE,PWM_OUT_1,1.25*width3);
PWMPulseWidthSet(PWM0_BASE,PWM_OUT_0,1.25*width4);
EPWM_Output(1.25*width1,1.25*width2,1.25*width3,1.25*width4);
}
void EPWM_Output(uint16_t width5,uint16_t width6,uint16_t width7,uint16_t width8)
{
PWMPulseWidthSet(PWM0_BASE,PWM_OUT_5,width5);
PWMPulseWidthSet(PWM0_BASE,PWM_OUT_4,width6);
PWMPulseWidthSet(PWM0_BASE,PWM_OUT_2,width7);
PWMPulseWidthSet(PWM0_BASE,PWM_OUT_3,width8);
}
强烈建议在实验室里面做,实验室有仪器,即使出现问题也可以更快地找出来。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)