motor.rs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. //! Open loop motor control
  2. #![deny(unsafe_code)]
  3. #![deny(warnings)]
  4. #![no_main]
  5. #![no_std]
  6. extern crate cortex_m_rt as rt;
  7. extern crate cortex_m_semihosting as sh;
  8. extern crate motor_driver;
  9. extern crate panic_semihosting;
  10. #[macro_use(block)]
  11. extern crate nb;
  12. extern crate stm32f1xx_hal as hal;
  13. use core::fmt::Write;
  14. use hal::prelude::*;
  15. use hal::serial::Serial;
  16. use hal::stm32f103xx;
  17. use motor_driver::Motor;
  18. use rt::{entry, exception, ExceptionFrame};
  19. use sh::hio;
  20. #[entry]
  21. fn main() -> ! {
  22. let p = stm32f103xx::Peripherals::take().unwrap();
  23. let mut flash = p.FLASH.constrain();
  24. let mut rcc = p.RCC.constrain();
  25. let clocks = rcc.cfgr.freeze(&mut flash.acr);
  26. let mut afio = p.AFIO.constrain(&mut rcc.apb2);
  27. let mut gpioa = p.GPIOA.split(&mut rcc.apb2);
  28. let tx = gpioa.pa9.into_alternate_push_pull(&mut gpioa.crh);
  29. let rx = gpioa.pa10;
  30. let serial = Serial::usart1(
  31. p.USART1,
  32. (tx, rx),
  33. &mut afio.mapr,
  34. 115_200.bps(),
  35. clocks,
  36. &mut rcc.apb2,
  37. );
  38. let mut rx = serial.split().1;
  39. let pwm = p.TIM2.pwm(
  40. gpioa.pa0.into_alternate_push_pull(&mut gpioa.crl),
  41. &mut afio.mapr,
  42. 1.khz(),
  43. clocks,
  44. &mut rcc.apb1,
  45. );
  46. let max_duty = pwm.get_max_duty() as i16;
  47. let mut motor = Motor::tb6612fng(
  48. gpioa.pa1.into_push_pull_output(&mut gpioa.crl),
  49. gpioa.pa2.into_push_pull_output(&mut gpioa.crl),
  50. pwm,
  51. );
  52. let mut duty = max_duty;
  53. let mut brake = true;
  54. motor.duty(duty as u16);
  55. let mut hstdout = hio::hstdout().unwrap();
  56. writeln!(hstdout, "{} {}", max_duty, brake).unwrap();
  57. loop {
  58. match block!(rx.read()).unwrap() {
  59. b'*' => duty *= 2,
  60. b'+' => duty += 1,
  61. b'-' => duty -= 1,
  62. b'/' => duty /= 2,
  63. b'r' => duty *= -1,
  64. b's' => brake = !brake,
  65. _ => continue,
  66. }
  67. if duty > max_duty {
  68. duty = max_duty;
  69. } else if duty < -max_duty {
  70. duty = -max_duty;
  71. }
  72. if brake {
  73. motor.brake();
  74. } else if duty > 0 {
  75. motor.cw();
  76. } else {
  77. motor.ccw();
  78. }
  79. motor.duty(duty.abs() as u16);
  80. writeln!(hstdout, "{} {}", duty, brake).unwrap();
  81. }
  82. }
  83. #[exception]
  84. fn HardFault(ef: &ExceptionFrame) -> ! {
  85. panic!("{:#?}", ef);
  86. }
  87. #[exception]
  88. fn DefaultHandler(irqn: i16) {
  89. panic!("Unhandled exception (IRQn = {})", irqn);
  90. }