黄工无刷电机学习
直播中

欲望都市

9年用户 881经验值
擅长:可编程逻辑
私信 关注
[问答]

如何采用XCOM V2.2串口调试助手向STM32串口发送数据?

如何采用XCOM V2.2串口调试助手向STM32串口发送数据?

回帖(1)

林倩倩

2021-10-18 10:23:41
在读书期间,需要用到步进电机。用STM32F103ZET6作为下位机,采用计时器产生PWM波,通过改变改变ARR的值,改变PWM波的频率,实现步进电机调速,LCD屏幕显示串口收到的数值。
PC作为上位机,利用串口向STM32发出0-5的数字,根据收到的数值改变步进电机转速。
需要注意两点:
(1) PC上面的串口调试助手在默认情况下,发出的是ASCⅠⅠ码,在接收时需要做数据处理,运算输出数字;
(2)改变计数器产生PWM的频率与改变占空比不用,改变占空比的时候,可以在PWM连续产生的过程中改变,而改变PWM波的频率,需要先DISABLE,更新ARR,再ENABLE(该方法是目前试的一种可用的,应该还会有其他方法。。。)。

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "lcd.h"
#include "math.h"

int main(void)
{               
        //extern u32 tally;        //用法  extern + 类型 + 变量名
        //u16    Angle_num;
        //u32    Num;
        u8 t;
        u8 n;
        u8 len;
  //u16 speed_val;
        u16 val;
        delay_init();                         //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(115200);             //串口初始化为115200
        LED_Init();              //LED端口初始化
  OUTPUT_Init();
  //TIM2_PWM_Init(100,72);         
  //Angle_num=360;                   //表示要转的角度 10个脉冲电机转1°
        //Num=Angle_num*10;                      //3600 Pulse/rev  Angle_num表示要转多少度(10个脉冲转一度)
        LCD_Init();                                    //LCD端口初始化
        POINT_COLOR=RED;     //设置字体为红色
        LCD_ShowString(60,50,200,16,16,"Elite STM32");       
        LCD_ShowString(60,70,200,16,16,"USART");       
        LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(60,110,200,16,16,"2021/2/5");       
        //显示提示信息
        POINT_COLOR=BLUE;//设置字体为蓝色
        LCD_ShowString(60,130,200,16,16,"USART_VAL:");
       
         while(1)
        {
                if(USART_RX_STA&0x8000)                            //判断USART_RX_STA的最高位是否为1
                {                                          
                        val=0;
                        len=USART_RX_STA&0x3fff;                         //得到此次接收到的数据长度
                  for(t=0;t                         {
                                n=len-t-1;
                                val=val+(USART_RX_BUF[t]-48)*pow(10, n);      //串口传输过来的是ASC码,需要进行数字处理
                        }
                  
                         LCD_ShowxNum(160,130,val,4,16,0);               //显示串口输入的 数值
             USART_RX_STA=0;                                 //将接收状态标志去除
          
                if(val==0) TIM_Cmd(TIM2, DISABLE);
                else
                {
                   if(val==1)
                         {
                           TIM_Cmd(TIM2, DISABLE);                      //要先失能
                                 TIM2_PWM_Init(250,72);                        //更新arr值
                                 TIM_Cmd(TIM2, ENABLE);                       //再使能
                         }
                         if(val==2)
                         {
                                 TIM_Cmd(TIM2, DISABLE);
                                 TIM2_PWM_Init(200,72);//TIM2_PWM_Init(speed_val,72);         //不分频。计数频率=72000000/72=1000Khz,脉冲时间为0.1ms. (arr,psc) 输入需要的值即可,arr需要为偶数
                           TIM_Cmd(TIM2, ENABLE);
                         }
       if(val==3)
       {
                           TIM_Cmd(TIM2, DISABLE);
                                 TIM2_PWM_Init(150,72);
                           TIM_Cmd(TIM2, ENABLE);                 
                         }                 
                         if(val==4)
                         {
                           TIM_Cmd(TIM2, DISABLE);
                                 TIM2_PWM_Init(100,72);
                           TIM_Cmd(TIM2, ENABLE);                 
                         }
       if(val==5)
                   {
                           TIM_Cmd(TIM2, DISABLE);
                                 TIM2_PWM_Init(50,72);
                           TIM_Cmd(TIM2, ENABLE);                 
                         }
                }
         }
        }
#include "timer.h"
#include "led.h"
#include "usart.h"
u32 tally;
void TIM2_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       


        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //使能定时器2时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
       
        //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5   

   //设置该引脚为复用输出功能,输出TIM2 CH2的PWM脉冲波形        GPIOA.1
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM_CH2
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO

   //初始化TIM2
        TIM_TimeBaseStructure.TIM_Period = arr-1; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler =psc-1; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
       
        //初始化TIM2 Channel 2 PWM模式         
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;             //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_Pulse = arr/2-1;                         //给出ccr值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //输出极性:TIM输出比较极性高
        TIM_OC2Init(TIM2, &TIM_OCInitStructure);                      //根据T指定的参数初始化外设TIM3 OC2


        TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);             //使能TIM2在CCR2上的预装载寄存器
       
        /*TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );                     //使能指定的TIM2中断,允许更新中断


        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;               //TIM2中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     //先占优先级0级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;            //从优先级3级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);                               //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  */
}


/*void TIM2_IRQHandler(void)   //TIM3中断
{
        if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
                {
                TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源
                tally=tally+1;
                }
}*/


void OUTPUT_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);         //使能PE端口时钟
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;                             //PE.11 PE.12 端口配置, 推挽输出
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                               //IO口速度为50MHz
        GPIO_Init(GPIOE, &GPIO_InitStructure);                                                           //推挽输出 ,IO口速度为50MHz
  GPIO_ResetBits(GPIOE,GPIO_Pin_11);                                                                      //PE.11 输出低  接使能端
        GPIO_SetBits(GPIOE,GPIO_Pin_12);                                   //PE.12 输出低  接转向控制端


}

#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
void TIM3_Int_Init(u16 arr,u16 psc);
void TIM2_PWM_Init(u16 arr,u16 psc);
void OUTPUT_Init(void);
#endif
       

采用XCOM V2.2串口调试助手向STM32串口发送数据
经过测试可以正常使用。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分