STM32串口通信控制pwm

                 			   **STM32F103RC串口通信控制PWM**
  首先是配置我们的串口模块两个数据引脚如下

首先是配置时钟串口,每个32的芯片不一样时钟线也不一样,再就是两个引脚的初始化,看数据手册来配置,一般都是设置推挽输出(TX)和浮空输入(RX)不同的芯片io口不一样
首先是配置时钟串口,每个32的芯片不一样时钟线也不一样,再就是两个引脚的初始化,看数据手册来配置,一般都是设置推挽输出(TX)和浮空输入(RX)不同的芯片io口不一样

接下来就是串口的初始化
在这里我主要遇到的问题是初始化的奇偶校验和硬件流控制不知道填什么,后面百度老师说才懂没有填,这里的配置跟51的时候差不多
在这里我主要遇到的问题是初始化的奇偶校验和硬件流控制不知道填什么,后面百度老师说才懂没有填,这里的配置跟51的时候差不多
配置串口中断跟51一样,定义一个全局变量MyRvData把串口输入什么东西就打印出来
配置串口中断跟51一样,定义一个全局变量MyRvData把串口输入什么东西就打印出来

再然后配置一个有PWM 信号引脚,注意定时器的通道是完全重映射还是部分重映射,还要看这个引脚是否有其他的功能把其他的功能屏蔽掉,去查芯片的数据手册来配置,这样pwm的引脚配置就完成了。
再然后配置一个有PWM 信号引脚,注意定时器的通道是完全重映射还是部分重映射,还要看这个引脚是否有其他的功能把其他的功能屏蔽掉,去查芯片的数据手册来配置,这样pwm的引脚配置就完成了。
这是我配置一个灯来查看输入不同的pwm信号灯的亮度
这是我配置一个灯来查看输入不同的pwm信号灯的亮度
这是我的主函数
这是我的主函数
这是在串口输入0x01的亮度
这是在串口输入0x01的亮度
这是在串口输入0x50的亮度说明我用串口控制pwm已经成功
这是在串口输入0x50的亮度说明我用串口控制pwm已经成功。

要使用STM32串口控制电机,您需要连接电机驱动器到STM32的GPIO端口上,并使用STM32串口通信功能来发送指令给电机驱动器。 下面是一个简单的示例代码,用于通过STM32串口控制电机的方向和速度: ```c #include "stm32f4xx.h" #include "stdio.h" #define USARTx USART1 #define BAUDRATE 115200 #define MOTOR_GPIO_PORT GPIOA #define MOTOR_DIR_PIN GPIO_Pin_0 #define MOTOR_PWM_PIN GPIO_Pin_1 #define MOTOR_TIMER TIM2 #define MOTOR_TIMER_CHANNEL TIM_OCMode_PWM1 void init_USART(void); void init_motor(void); void USART_puts(char* str); int main(void) { init_USART(); init_motor(); while(1) { char cmd[10]; USART_puts("\nEnter motor command (d/speed): "); scanf("%s", cmd); if(cmd[0] == 'd') { if(cmd[1] == 'f') { GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_DIR_PIN); } else if(cmd[1] == 'r') { GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_DIR_PIN); } } else if(cmd[0] == 's') { uint16_t speed = atoi(cmd+1); TIM_SetCompare1(MOTOR_TIMER, speed); } } } void init_USART(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); USART_InitStructure.USART_BaudRate = BAUDRATE; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USARTx, &USART_InitStructure); USART_Cmd(USARTx, ENABLE); } void init_motor(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); GPIO_InitStructure.GPIO_Pin = MOTOR_DIR_PIN | MOTOR_PWM_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(MOTOR_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(MOTOR_GPIO_PORT, GPIO_PinSource0, GPIO_AF_TIM2); GPIO_PinAFConfig(MOTOR_GPIO_PORT, GPIO_PinSource1, GPIO_AF_TIM2); TIM_TimeBaseStructure.TIM_Period = 9999; TIM_TimeBaseStructure.TIM_Prescaler = 839; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(MOTOR_TIMER, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = MOTOR_TIMER_CHANNEL; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(MOTOR_TIMER, &TIM_OCInitStructure); TIM_Cmd(MOTOR_TIMER, ENABLE); } void USART_puts(char* str) { while(*str) { while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); USART_SendData(USARTx, *str); str++; } } ``` 上述代码中,我们使用了USART1作为串口通信接口,并且连接了电机驱动器的方向和PWM输入到GPIOA的第0和第1个引脚上。我们使用了定时器TIM2来控制PWM输出,并且使用了GPIOA的第0个引脚来控制电机的方向。我们使用了scanf函数来读取串口输入的指令,并根据指令来控制电机的方向和速度。 请注意,上述代码仅用于演示目的,实际的电机控制应该根据具体的电机驱动器和电机参数进行调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值