小车采用双电机驱动,双路红外循迹,pwm调节占空比以此调速,输于入门级别程序,只涉及i/o口和pwm知识相关知识,可以作为入门练手提升自信。
单片机源程序如下:
- // finish 2020/11/3 GaoYuan
- #include <msp430f5529.h>
- int pwm_l = 20; //给pwm附一个初始值
- int pwm_r = 20;
- void Keyscan();
- int begin=20;
- //pwm判断控制
- void detect();
- int main(void)
- {
- WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
- //初始化
- //motor 正转
- P1DIR |=BIT4+BIT5;//左电机
- P2DIR |=BIT4+BIT5;//右边电机
- P1OUT |=BIT4;
- P1OUT &=~BIT5;
- P2OUT |=BIT4;
- P2OUT &=~BIT5;
- P1DIR |=BIT0;//led
- P4DIR |=BIT7;
- P1DIR |=BIT2+BIT3;//pwm
- P1SEL |= BIT2+BIT3;
- P2DIR &=~(BIT2+BIT3) ; //left,right detection
- P2OUT |= BIT2+BIT3;
- P2REN |=BIT2+BIT3;
- TA0CCR0 = 124; //PWM周期定义
- TA0CTL = TASSEL_1 + MC_1 + TACLR; //参考时钟选择ACLK,增计数模式,清除TAR计数器
- while(1)
- {
- TA0CCTL1=OUTMOD_7;
- TA0CCTL2=OUTMOD_7;
- detect();
- TA0CCR1=pwm_l;
- TA0CCR2=pwm_r;
- __delay_cycles(30000);
- pwm_r=begin;
- pwm_l=begin;
- }
- }
- void detect()
- {
- {
- if( (P2IN & BIT2) && ( (P2IN & BIT3)==0) )//右偏
- {
- P4OUT |=BIT7;
- __delay_cycles(10000);
- P4OUT &=~BIT7;//led down 4.7
- pwm_l=pwm_l+20;
- }
- } if( ((P2IN & BIT2) ==0) && (P2IN & BIT3) )//左偏
- {
- P1OUT |=BIT0;
- __delay_cycles(10000);
- P1OUT &=~BIT0;//led down 1.0
- pwm_r=pwm_r+20;
- }
- }
复制代码
car_control.zip
(78.17 KB, 下载次数: 117)
|