Added support for use of EinsyRambo on Mini 2.master
						commit
						a0b1cda4b8
					
				| @ -0,0 +1,392 @@ | |||||||
|  | #ifndef TMC2310Stepper_h | ||||||
|  | #define TMC2310Stepper_h | ||||||
|  | 
 | ||||||
|  | //#define TMC2130DEBUG
 | ||||||
|  | 
 | ||||||
|  | #if defined(ARDUINO) && ARDUINO >= 100 | ||||||
|  | 	#include <Arduino.h> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | const uint32_t TMC2130Stepper_version = 0x10100; // v1.1.0
 | ||||||
|  | 
 | ||||||
|  | class TMC2130Stepper { | ||||||
|  | 	public: | ||||||
|  | 		TMC2130Stepper(uint8_t pinEN, uint8_t pinDIR, uint8_t pinStep, uint8_t pinCS); | ||||||
|  | 		void begin(); | ||||||
|  | 		void checkStatus(); | ||||||
|  | 		void rms_current(uint16_t mA, float multiplier=0.5, float RS=0.11); | ||||||
|  | 		uint16_t rms_current(); | ||||||
|  | 		void SilentStepStick2130(uint16_t mA); | ||||||
|  | 		void setCurrent(uint16_t mA, float Rsense, float multiplier); | ||||||
|  | 		uint16_t getCurrent(); | ||||||
|  | 		bool checkOT(); | ||||||
|  | 		bool getOTPW(); | ||||||
|  | 		void clear_otpw(); | ||||||
|  | 		bool isEnabled(); | ||||||
|  | //    void takeSteps(int steps);
 | ||||||
|  | //    void step(int steps, int speed);
 | ||||||
|  | 		// GCONF
 | ||||||
|  | 		uint32_t GCONF(); | ||||||
|  | 		void GCONF(								uint32_t value); | ||||||
|  | 		void I_scale_analog(			bool B); | ||||||
|  | 		void internal_Rsense(			bool B); | ||||||
|  | 		void en_pwm_mode(					bool B); | ||||||
|  | 		void enc_commutation(			bool B); | ||||||
|  | 		void shaft(								bool B); | ||||||
|  | 		void diag0_error(					bool B); | ||||||
|  | 		void diag0_otpw(					bool B); | ||||||
|  | 		void diag0_stall(					bool B); | ||||||
|  | 		void diag1_stall(					bool B); | ||||||
|  | 		void diag1_index(					bool B); | ||||||
|  | 		void diag1_onstate(				bool B); | ||||||
|  | 		void diag1_steps_skipped(	bool B); | ||||||
|  | 		void diag0_int_pushpull(	bool B); | ||||||
|  | 		void diag1_pushpull(			bool B); | ||||||
|  | 		void small_hysterisis(		bool B); | ||||||
|  | 		void stop_enable(					bool B); | ||||||
|  | 		void direct_mode(					bool B); | ||||||
|  | 		bool I_scale_analog(); | ||||||
|  | 		bool internal_Rsense(); | ||||||
|  | 		bool en_pwm_mode(); | ||||||
|  | 		bool enc_commutation(); | ||||||
|  | 		bool shaft(); | ||||||
|  | 		bool diag0_error(); | ||||||
|  | 		bool diag0_otpw(); | ||||||
|  | 		bool diag0_stall(); | ||||||
|  | 		bool diag1_stall(); | ||||||
|  | 		bool diag1_index(); | ||||||
|  | 		bool diag1_onstate(); | ||||||
|  | 		bool diag1_steps_skipped(); | ||||||
|  | 		bool diag0_int_pushpull(); | ||||||
|  | 		bool diag1_pushpull(); | ||||||
|  | 		bool small_hysterisis(); | ||||||
|  | 		bool stop_enable(); | ||||||
|  | 		bool direct_mode(); | ||||||
|  | 		// IHOLD_IRUN
 | ||||||
|  | 		void IHOLD_IRUN(					uint32_t input); | ||||||
|  | 		uint32_t IHOLD_IRUN(); | ||||||
|  | 		void 	ihold(							uint8_t B); | ||||||
|  | 		void 	irun(								uint8_t B); | ||||||
|  | 		void 	iholddelay(					uint8_t B); | ||||||
|  | 		uint8_t ihold(); | ||||||
|  | 		uint8_t irun(); | ||||||
|  | 		uint8_t iholddelay(); | ||||||
|  | 		// GSTAT
 | ||||||
|  | 		void 	GSTAT(							uint8_t input); | ||||||
|  | 		uint8_t GSTAT(); | ||||||
|  | 		bool 	reset(); | ||||||
|  | 		bool 	drv_err(); | ||||||
|  | 		bool 	uv_cp(); | ||||||
|  | 		// IOIN
 | ||||||
|  | 		uint32_t 	IOIN(); | ||||||
|  | 		bool 		step(); | ||||||
|  | 		bool 		dir(); | ||||||
|  | 		bool 		dcen_cfg4(); | ||||||
|  | 		bool 		dcin_cfg5(); | ||||||
|  | 		bool 		drv_enn_cfg6(); | ||||||
|  | 		bool 		dco(); | ||||||
|  | 		uint8_t 	version(); | ||||||
|  | 		// TPOWERDOWN
 | ||||||
|  | 		uint32_t TPOWERDOWN(); | ||||||
|  | 		void TPOWERDOWN(					uint32_t input); | ||||||
|  | 		// TSTEP
 | ||||||
|  | 		uint32_t TSTEP(); | ||||||
|  | 		// TPWMTHRS
 | ||||||
|  | 		uint32_t TPWMTHRS(); | ||||||
|  | 		void TPWMTHRS(						uint32_t input); | ||||||
|  | 		// TCOOLTHRS
 | ||||||
|  | 		uint32_t TCOOLTHRS(); | ||||||
|  | 		void TCOOLTHRS(						uint32_t input); | ||||||
|  | 		// THIGH
 | ||||||
|  | 		uint32_t THIGH(); | ||||||
|  | 		void THIGH(								uint32_t input); | ||||||
|  | 		// XDRIRECT
 | ||||||
|  | 		uint32_t XDIRECT(); | ||||||
|  | 		void XDIRECT(							uint32_t input); | ||||||
|  | 		void coil_A(							int16_t 	B); | ||||||
|  | 		void coil_B(							int16_t 	B); | ||||||
|  | 		int16_t coil_A(); | ||||||
|  | 		int16_t coil_B(); | ||||||
|  | 		// VDCMIN
 | ||||||
|  | 		uint32_t VDCMIN(); | ||||||
|  | 		void VDCMIN(							uint32_t input); | ||||||
|  | 		// CHOPCONF
 | ||||||
|  | 		uint32_t CHOPCONF(); | ||||||
|  | 		void CHOPCONF(						uint32_t value); | ||||||
|  | 		void toff(								uint8_t B); | ||||||
|  | 		void hstrt(								uint8_t B); | ||||||
|  | 		void hend(								int8_t  B); | ||||||
|  | 		void fd(									uint8_t B); | ||||||
|  | 		void disfdcc(							bool 		B); | ||||||
|  | 		void rndtf(								bool 		B); | ||||||
|  | 		void chm(									bool 		B); | ||||||
|  | 		void tbl(									uint8_t B); | ||||||
|  | 		void vsense(							bool 		B); | ||||||
|  | 		void vhighfs(							bool 		B); | ||||||
|  | 		void vhighchm(						bool 		B); | ||||||
|  | 		void sync(								uint8_t B); | ||||||
|  | 		void mres(								uint8_t B); | ||||||
|  | 		void intpol(							bool 		B); | ||||||
|  | 		void dedge(								bool 		B); | ||||||
|  | 		void diss2g(							bool 		B); | ||||||
|  | 		uint8_t toff(); | ||||||
|  | 		uint8_t hstrt(); | ||||||
|  | 		int8_t  hend(); | ||||||
|  | 		uint8_t fd(); | ||||||
|  | 		bool 	disfdcc(); | ||||||
|  | 		bool 	rndtf(); | ||||||
|  | 		bool 	chm(); | ||||||
|  | 		uint8_t tbl(); | ||||||
|  | 		bool 	vsense(); | ||||||
|  | 		bool 	vhighfs(); | ||||||
|  | 		bool 	vhighchm(); | ||||||
|  | 		uint8_t sync(); | ||||||
|  | 		uint8_t mres(); | ||||||
|  | 		bool 	intpol(); | ||||||
|  | 		bool 	dedge(); | ||||||
|  | 		bool 	diss2g(); | ||||||
|  | 		// COOLCONF
 | ||||||
|  | 		void COOLCONF(uint32_t value); | ||||||
|  | 		uint32_t COOLCONF(); | ||||||
|  | 		void semin(								uint8_t B); | ||||||
|  | 		void seup(								uint8_t B); | ||||||
|  | 		void semax(								uint8_t B); | ||||||
|  | 		void sedn(								uint8_t B); | ||||||
|  | 		void seimin(							bool 		B); | ||||||
|  | 		void sgt(									uint8_t B); | ||||||
|  | 		void sfilt(								bool 		B); | ||||||
|  | 		uint8_t semin(); | ||||||
|  | 		uint8_t seup(); | ||||||
|  | 		uint8_t semax(); | ||||||
|  | 		uint8_t sedn(); | ||||||
|  | 		bool seimin(); | ||||||
|  | 		uint8_t sgt(); | ||||||
|  | 		bool sfilt(); | ||||||
|  | 		// PWMCONF
 | ||||||
|  | 		void PWMCONF(							uint32_t value); | ||||||
|  | 		uint32_t PWMCONF(); | ||||||
|  | 		void pwm_ampl(						uint8_t B); | ||||||
|  | 		void pwm_grad(						uint8_t B); | ||||||
|  | 		void pwm_freq(						uint8_t B); | ||||||
|  | 		void pwm_autoscale(				bool		B); | ||||||
|  | 		void pwm_symmetric(				bool		B); | ||||||
|  | 		void freewheel(						uint8_t B); | ||||||
|  | 		uint8_t pwm_ampl(); | ||||||
|  | 		uint8_t pwm_grad(); | ||||||
|  | 		uint8_t pwm_freq(); | ||||||
|  | 		bool 	pwm_autoscale(); | ||||||
|  | 		bool 	pwm_symmetric(); | ||||||
|  | 		uint8_t freewheel(); | ||||||
|  | 		// DRVSTATUS
 | ||||||
|  | 		uint32_t DRV_STATUS(); | ||||||
|  | 		uint16_t sg_result(); | ||||||
|  | 		bool fsactive(); | ||||||
|  | 		uint8_t cs_actual(); | ||||||
|  | 		bool stallguard(); | ||||||
|  | 		bool ot(); | ||||||
|  | 		bool otpw(); | ||||||
|  | 		bool s2ga(); | ||||||
|  | 		bool s2gb(); | ||||||
|  | 		bool ola(); | ||||||
|  | 		bool olb(); | ||||||
|  | 		bool stst(); | ||||||
|  | 		// PWM_SCALE
 | ||||||
|  | 		uint8_t PWM_SCALE(); | ||||||
|  | 		// ENCM_CTRL
 | ||||||
|  | 		uint8_t ENCM_CTRL(); | ||||||
|  | 		void ENCM_CTRL(						uint8_t input); | ||||||
|  | 		void inv(									bool B); | ||||||
|  | 		void maxspeed(						bool B); | ||||||
|  | 		bool inv(); | ||||||
|  | 		bool maxspeed(); | ||||||
|  | 		// LOST_STEPS
 | ||||||
|  | 		uint32_t LOST_STEPS(); | ||||||
|  | 
 | ||||||
|  | 		// Helper functions
 | ||||||
|  | 		void microsteps(uint16_t ms); | ||||||
|  | 		uint16_t microsteps(); | ||||||
|  | 		void blank_time(uint8_t value); | ||||||
|  | 		uint8_t blank_time(); | ||||||
|  | 		void hysterisis_end(int8_t value); | ||||||
|  | 		int8_t hysterisis_end(); | ||||||
|  | 		void hysterisis_start(uint8_t value); | ||||||
|  | 		uint8_t hysterisis_start(); | ||||||
|  | 		void sg_current_decrease(uint8_t value); | ||||||
|  | 		uint8_t sg_current_decrease(); | ||||||
|  | 
 | ||||||
|  | 		// Aliases
 | ||||||
|  | 
 | ||||||
|  | 		// RW: GCONF
 | ||||||
|  | 		inline bool			external_ref()										__attribute__((always_inline)) { return I_scale_analog(); 					} | ||||||
|  | 		inline bool 		internal_sense_R()								__attribute__((always_inline)) { return internal_Rsense(); 					} | ||||||
|  | 		inline bool 		stealthChop()											__attribute__((always_inline)) { return en_pwm_mode(); 							} | ||||||
|  | 		inline bool 		commutation()											__attribute__((always_inline)) { return enc_commutation(); 					} | ||||||
|  | 		inline bool 		shaft_dir()												__attribute__((always_inline)) { return shaft(); 										} | ||||||
|  | 		inline bool 		diag0_errors()										__attribute__((always_inline)) { return diag0_error(); 							} | ||||||
|  | 		inline bool 		diag0_temp_prewarn()							__attribute__((always_inline)) { return diag0_otpw();								} | ||||||
|  | 		inline bool 		diag1_chopper_on()								__attribute__((always_inline)) { return diag1_onstate(); 						} | ||||||
|  | 		inline bool 		diag0_active_high()								__attribute__((always_inline)) { return diag0_int_pushpull(); 			} | ||||||
|  | 		inline bool 		diag1_active_high()								__attribute__((always_inline)) { return diag1_pushpull(); 					} | ||||||
|  | 		inline void			external_ref(					bool value)	__attribute__((always_inline)) { 				I_scale_analog(value); 			} | ||||||
|  | 		inline void 		internal_sense_R(			bool value)	__attribute__((always_inline)) {				internal_Rsense(value); 		} | ||||||
|  | 		inline void 		stealthChop(					bool value)	__attribute__((always_inline)) {				en_pwm_mode(value); 				} | ||||||
|  | 		inline void 		commutation(					bool value)	__attribute__((always_inline)) {				enc_commutation(value); 		} | ||||||
|  | 		inline void 		shaft_dir(						bool value)	__attribute__((always_inline)) {				shaft(value); 							} | ||||||
|  | 		inline void 		diag0_errors(					bool value)	__attribute__((always_inline)) {				diag0_error(value); 				} | ||||||
|  | 		inline void 		diag0_temp_prewarn(		bool value)	__attribute__((always_inline)) {				diag0_otpw(value);					} | ||||||
|  | 		inline void 		diag1_chopper_on(			bool value)	__attribute__((always_inline)) {				diag1_onstate(value); 			} | ||||||
|  | 		inline void 		diag0_active_high(		bool value)	__attribute__((always_inline)) {				diag0_int_pushpull(value); 	} | ||||||
|  | 		inline void 		diag1_active_high(		bool value)	__attribute__((always_inline)) {				diag1_pushpull(value); 			} | ||||||
|  | 		// RC
 | ||||||
|  | 		inline uint8_t 	status_flags()										__attribute__((always_inline)) { return GSTAT(); 										} | ||||||
|  | 		// R
 | ||||||
|  | 		inline uint32_t input()														__attribute__((always_inline)) { return IOIN(); 										} | ||||||
|  | 		// W: IHOLD_IRUN
 | ||||||
|  | 		inline uint8_t 	hold_current()										__attribute__((always_inline)) { return ihold(); 										} | ||||||
|  | 		inline uint8_t 	run_current()											__attribute__((always_inline)) { return irun(); 										} | ||||||
|  | 		inline uint8_t 	hold_delay()											__attribute__((always_inline)) { return iholddelay(); 							} | ||||||
|  | 		inline void 		hold_current(			 uint8_t value) __attribute__((always_inline)) {				ihold(value); 							} | ||||||
|  | 		inline void 		run_current(			 uint8_t value) __attribute__((always_inline)) {				irun(value); 								} | ||||||
|  | 		inline void 		hold_delay(				 uint8_t value) __attribute__((always_inline)) {				iholddelay(value); 					} | ||||||
|  | 		// W
 | ||||||
|  | 		inline uint8_t 	power_down_delay()								__attribute__((always_inline)) { return TPOWERDOWN(); 							} | ||||||
|  | 		inline void 		power_down_delay(	 uint8_t value) __attribute__((always_inline)) { 				TPOWERDOWN(value); 					} | ||||||
|  | 		// R
 | ||||||
|  | 		inline uint32_t microstep_time()									__attribute__((always_inline)) { return TSTEP(); 										} | ||||||
|  | 		// W
 | ||||||
|  | 		inline uint32_t stealth_max_speed()								__attribute__((always_inline)) { return TPWMTHRS(); 								} | ||||||
|  | 		inline void 		stealth_max_speed(uint32_t value)	__attribute__((always_inline)) {				TPWMTHRS(value); 						} | ||||||
|  | 		// W
 | ||||||
|  | 		inline uint32_t coolstep_min_speed()							__attribute__((always_inline)) { return TCOOLTHRS(); 								} | ||||||
|  | 		inline void    coolstep_min_speed(uint32_t value) __attribute__((always_inline)) {				TCOOLTHRS(value); 					} | ||||||
|  | 		// W
 | ||||||
|  | 		inline uint32_t mode_sw_speed()										__attribute__((always_inline)) { return THIGH(); 										} | ||||||
|  | 		inline void 		mode_sw_speed(		uint32_t value)	__attribute__((always_inline)) {				THIGH(value); 							} | ||||||
|  | 		// RW: XDIRECT
 | ||||||
|  | 		inline int16_t 	coil_A_current()									__attribute__((always_inline)) { return coil_A(); 									} | ||||||
|  | 		inline void 		coil_A_current(		 int16_t value)	__attribute__((always_inline)) {				coil_B(value); 							} | ||||||
|  | 		inline int16_t 	coil_B_current()									__attribute__((always_inline)) { return coil_A(); 									} | ||||||
|  | 		inline void 		coil_B_current(		 int16_t value)	__attribute__((always_inline)) {				coil_B(value); 							} | ||||||
|  | 		// W
 | ||||||
|  | 		inline uint32_t DCstep_min_speed()								__attribute__((always_inline)) { return VDCMIN(); 									} | ||||||
|  | 		inline void 		DCstep_min_speed(	uint32_t value)	__attribute__((always_inline)) {				VDCMIN(value); 							} | ||||||
|  | 		// RW: CHOPCONF
 | ||||||
|  | 		inline uint8_t 	off_time()												__attribute__((always_inline)) { return toff(); 										} | ||||||
|  | //		inline uint8_t 	hysterisis_start()								__attribute__((always_inline)) { return hstrt(); 										}
 | ||||||
|  | //		inline int8_t 	hysterisis_low()									__attribute__((always_inline)) { return hend(); 										}
 | ||||||
|  | 		inline int8_t 	hysterisis_low()									__attribute__((always_inline)) { return hysterisis_end(); 					} | ||||||
|  | 		inline uint8_t 	fast_decay_time()									__attribute__((always_inline)) { return fd(); 											} | ||||||
|  | 		inline bool 		disable_I_comparator()						__attribute__((always_inline)) { return disfdcc(); 									} | ||||||
|  | 		inline bool 		random_off_time()									__attribute__((always_inline)) { return rndtf(); 										} | ||||||
|  | 		inline bool 		chopper_mode()										__attribute__((always_inline)) { return chm(); 											} | ||||||
|  | //		inline uint8_t 	blank_time()											__attribute__((always_inline)) { return tbl(); 											}
 | ||||||
|  | 		inline bool 		high_sense_R()										__attribute__((always_inline)) { return vsense(); 									} | ||||||
|  | 		inline bool 		fullstep_threshold()							__attribute__((always_inline)) { return vhighfs(); 									} | ||||||
|  | 		inline bool 		high_speed_mode()									__attribute__((always_inline)) { return vhighchm(); 								} | ||||||
|  | 		inline uint8_t 	sync_phases()											__attribute__((always_inline)) { return sync(); 										} | ||||||
|  | //		inline uint16_t microsteps()											__attribute__((always_inline)) { return mres(); 										}
 | ||||||
|  | 		inline bool 		interpolate()											__attribute__((always_inline)) { return intpol(); 									} | ||||||
|  | 		inline bool 		double_edge_step()								__attribute__((always_inline)) { return dedge(); 										} | ||||||
|  | 		inline bool 		disable_short_protection()				__attribute__((always_inline)) { return diss2g(); 									} | ||||||
|  | 		inline void 		off_time(					 uint8_t value)	__attribute__((always_inline)) {				toff(value); 								} | ||||||
|  | //		inline void 		hysterisis_start(	 uint8_t value)	__attribute__((always_inline)) {				hstrt(value); 							}
 | ||||||
|  | //		inline void 		hysterisis_low(		  int8_t value)	__attribute__((always_inline)) {				hend(value); 								}
 | ||||||
|  | 		inline void 		hysterisis_low(		  int8_t value)	__attribute__((always_inline)) {				hysterisis_end(value); 			} | ||||||
|  | 		inline void 		fast_decay_time(	 uint8_t value)	__attribute__((always_inline)) {				fd(value); 									} | ||||||
|  | 		inline void 		disable_I_comparator( bool value)	__attribute__((always_inline)) {				disfdcc(value);							} | ||||||
|  | 		inline void 		random_off_time(			bool value)	__attribute__((always_inline)) {				rndtf(value); 							} | ||||||
|  | 		inline void 		chopper_mode(					bool value)	__attribute__((always_inline)) {				chm(value); 								} | ||||||
|  | //		inline void 		blank_time(				 uint8_t value)	__attribute__((always_inline)) {				tbl(value); 								}
 | ||||||
|  | 		inline void 		high_sense_R(					bool value)	__attribute__((always_inline)) {				vsense(value); 							} | ||||||
|  | 		inline void 		fullstep_threshold(		bool value)	__attribute__((always_inline)) {				vhighfs(value); 						} | ||||||
|  | 		inline void 		high_speed_mode(			bool value)	__attribute__((always_inline)) {				vhighchm(value); 						} | ||||||
|  | 		inline void 		sync_phases(			 uint8_t value)	__attribute__((always_inline)) {				sync(value); 								} | ||||||
|  | //		inline void			microsteps(				uint16_t value)	__attribute__((always_inline)) {				mres(value); 								}
 | ||||||
|  | 		inline void 		interpolate(					bool value)	__attribute__((always_inline)) {				intpol(value); 							} | ||||||
|  | 		inline void 		double_edge_step(			bool value)	__attribute__((always_inline)) {				dedge(value); 							} | ||||||
|  | 		inline void 	disable_short_protection(bool value)__attribute__((always_inline)) {				diss2g(value); 							} | ||||||
|  | 		// W: COOLCONF
 | ||||||
|  | 		inline uint8_t 	sg_min()													__attribute__((always_inline)) { return semin(); 										} | ||||||
|  | 		inline uint8_t 	sg_step_width()										__attribute__((always_inline)) { return seup(); 										} | ||||||
|  | 		inline uint8_t 	sg_max()													__attribute__((always_inline)) { return semax(); 										} | ||||||
|  | //		inline uint8_t 	sg_current_decrease()							__attribute__((always_inline)) { return sedn(); 										}
 | ||||||
|  | 		inline uint8_t 	smart_min_current()								__attribute__((always_inline)) { return seimin(); 									} | ||||||
|  | 		inline int8_t 	sg_stall_value()									__attribute__((always_inline)) { return sgt(); 											} | ||||||
|  | 		inline bool 		sg_filter()												__attribute__((always_inline)) { return sfilt(); 										} | ||||||
|  | 		inline void 		sg_min(						 uint8_t value)	__attribute__((always_inline)) {				semin(value); 							} | ||||||
|  | 		inline void 		sg_step_width(		 uint8_t value)	__attribute__((always_inline)) {				seup(value); 								} | ||||||
|  | 		inline void 		sg_max(						 uint8_t value)	__attribute__((always_inline)) {				semax(value); 							} | ||||||
|  | //		inline void 		sg_current_decrease(uint8_t value)__attribute__((always_inline)) {				sedn(value); 								}
 | ||||||
|  | 		inline void 		smart_min_current( uint8_t value)	__attribute__((always_inline)) {				seimin(value); 							} | ||||||
|  | 		inline void 		sg_stall_value(			int8_t value)	__attribute__((always_inline)) {				sgt(value); 								} | ||||||
|  | 		inline void 		sg_filter(						bool value)	__attribute__((always_inline)) {				sfilt(value); 							} | ||||||
|  | 		// W: PWMCONF
 | ||||||
|  | 		inline uint8_t 	stealth_amplitude()								__attribute__((always_inline)) { return pwm_ampl(); 								} | ||||||
|  | 		inline uint8_t 	stealth_gradient()								__attribute__((always_inline)) { return pwm_grad(); 								} | ||||||
|  | 		inline uint8_t 	stealth_freq()										__attribute__((always_inline)) { return pwm_freq(); 								} | ||||||
|  | 		inline bool 		stealth_autoscale()								__attribute__((always_inline)) { return pwm_autoscale(); 						} | ||||||
|  | 		inline bool 		stealth_symmetric()								__attribute__((always_inline)) { return pwm_symmetric(); 						} | ||||||
|  | 		inline uint8_t 	standstill_mode()									__attribute__((always_inline)) { return freewheel(); 								} | ||||||
|  | 		inline void 		stealth_amplitude( uint8_t value)	__attribute__((always_inline)) {				pwm_ampl(value); 						} | ||||||
|  | 		inline void 		stealth_gradient(	 uint8_t value)	__attribute__((always_inline)) {				pwm_grad(value); 						} | ||||||
|  | 		inline void 		stealth_freq(			 uint8_t value)	__attribute__((always_inline)) {				pwm_freq(value); 						} | ||||||
|  | 		inline void 		stealth_autoscale(		bool value)	__attribute__((always_inline)) {				pwm_autoscale(value); 			} | ||||||
|  | 		inline void 		stealth_symmetric(		bool value)	__attribute__((always_inline)) {				pwm_symmetric(value); 			} | ||||||
|  | 		inline void 		standstill_mode(	 uint8_t value)	__attribute__((always_inline)) {				freewheel(value); 					} | ||||||
|  | 		// W: ENCM_CTRL
 | ||||||
|  | 		inline bool 		invert_encoder()									__attribute__((always_inline)) { return inv(); 											} | ||||||
|  | 		inline void 		invert_encoder(				bool value)	__attribute__((always_inline)) {				inv(value); 								} | ||||||
|  | 		// R: DRV_STATUS
 | ||||||
|  | 		inline uint32_t DRVSTATUS()												__attribute__((always_inline)) { return DRV_STATUS(); 							} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		float Rsense = 0.11; | ||||||
|  | 		bool _started; | ||||||
|  | 		uint8_t status_response; | ||||||
|  | 		bool flag_otpw = false; | ||||||
|  | 
 | ||||||
|  | 	private: | ||||||
|  | 		//const uint8_t WRITE     = 0b10000000;
 | ||||||
|  | 		//const uint8_t READ      = 0b00000000;
 | ||||||
|  | 		uint8_t _pinEN        = 16; | ||||||
|  | 		uint8_t _pinSTEP      = 18; | ||||||
|  | 		uint8_t _pinCS        = 17; | ||||||
|  | 		//const int MOSI_PIN    = 12;
 | ||||||
|  | 		//const int MISO_PIN    = 11;
 | ||||||
|  | 		//const int SCK_PIN     = 13;
 | ||||||
|  | 		uint8_t _pinDIR       = 19; | ||||||
|  | 
 | ||||||
|  | 		// Shadow registers
 | ||||||
|  | 		uint32_t 	GCONF_sr 			= 0x00000000UL, | ||||||
|  | 							IHOLD_IRUN_sr = 0x00000000UL, | ||||||
|  | 							TSTEP_sr 			= 0x00000000UL, | ||||||
|  | 							TPWMTHRS_sr 	= 0x00000000UL, | ||||||
|  | 							TCOOLTHRS_sr 	= 0x00000000UL, | ||||||
|  | 							THIGH_sr 			= 0x00000000UL, | ||||||
|  | 							XDIRECT_sr 		= 0x00000000UL, | ||||||
|  | 							VDCMIN_sr 		= 0x00000000UL, | ||||||
|  | 							MSLUT0_sr 		= 0x00000000UL, | ||||||
|  | 							MSLUT1_sr 		= 0x00000000UL, | ||||||
|  | 							MSLUT2_sr 		= 0x00000000UL, | ||||||
|  | 							MSLUT3_sr 		= 0x00000000UL, | ||||||
|  | 							MSLUT4_sr 		= 0x00000000UL, | ||||||
|  | 							MSLUT5_sr 		= 0x00000000UL, | ||||||
|  | 							MSLUT6_sr 		= 0x00000000UL, | ||||||
|  | 							MSLUT7_sr 		= 0x00000000UL, | ||||||
|  | 							MSLUTSEL_sr 	= 0x00000000UL, | ||||||
|  | 							CHOPCONF_sr 	= 0x00000000UL, | ||||||
|  | 							COOLCONF_sr 	= 0x00000000UL, | ||||||
|  | 							DCCTRL_sr 		= 0x00000000UL, | ||||||
|  | 							PWMCONF_sr 		= 0x00050480UL, | ||||||
|  | 							tmp_sr 				= 0x00000000UL, | ||||||
|  | 							TPOWERDOWN_sr = 0x00000000UL, | ||||||
|  | 							ENCM_CTRL_sr 	= 0x00000000UL, | ||||||
|  | 							GSTAT_sr			= 0x00000000UL, | ||||||
|  | 						  MSLUTSTART_sr = 0x00000000UL; | ||||||
|  | 
 | ||||||
|  | 		void send2130(uint8_t addressByte, uint32_t *config); | ||||||
|  | 
 | ||||||
|  | 		uint16_t val_mA           = 0; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
| @ -0,0 +1,288 @@ | |||||||
|  | #ifndef TMC2130Stepper_REGDEFS_h | ||||||
|  | #define TMC2130Stepper_REGDEFS_h | ||||||
|  | 
 | ||||||
|  | constexpr uint8_t TMC2130_READ		= 0x00; | ||||||
|  | constexpr uint8_t TMC2130_WRITE		= 0x80; | ||||||
|  | 
 | ||||||
|  | // Register memory positions
 | ||||||
|  | constexpr uint8_t REG_GCONF			= 0x00; | ||||||
|  | constexpr uint8_t REG_GSTAT			= 0x01; | ||||||
|  | constexpr uint8_t REG_IOIN			= 0x04; | ||||||
|  | constexpr uint8_t REG_IHOLD_IRUN	= 0x10; | ||||||
|  | constexpr uint8_t REG_TPOWERDOWN	= 0x11; | ||||||
|  | constexpr uint8_t REG_TSTEP			= 0x12; | ||||||
|  | constexpr uint8_t REG_TPWMTHRS		= 0x13; | ||||||
|  | constexpr uint8_t REG_TCOOLTHRS		= 0x14; | ||||||
|  | constexpr uint8_t REG_THIGH			= 0x15; | ||||||
|  | constexpr uint8_t REG_XDIRECT		= 0x2D; | ||||||
|  | constexpr uint8_t REG_VDCMIN		= 0x33; | ||||||
|  | constexpr uint8_t REG_MSLUT0		= 0x60; | ||||||
|  | constexpr uint8_t REG_MSLUT1		= 0x61; | ||||||
|  | constexpr uint8_t REG_MSLUT2		= 0x62; | ||||||
|  | constexpr uint8_t REG_MSLUT3		= 0x63; | ||||||
|  | constexpr uint8_t REG_MSLUT4		= 0x64; | ||||||
|  | constexpr uint8_t REG_MSLUT5		= 0x65; | ||||||
|  | constexpr uint8_t REG_MSLUT6		= 0x66; | ||||||
|  | constexpr uint8_t REG_MSLUT7		= 0x67; | ||||||
|  | constexpr uint8_t REG_MSLUTSEL		= 0x68; | ||||||
|  | constexpr uint8_t REG_MSLUTSTART	= 0x69; | ||||||
|  | constexpr uint8_t REG_MSCNT			= 0x6A; | ||||||
|  | constexpr uint8_t REG_MSCURACT		= 0x6B; | ||||||
|  | constexpr uint8_t REG_CHOPCONF		= 0x6C; | ||||||
|  | constexpr uint8_t REG_COOLCONF		= 0x6D; | ||||||
|  | constexpr uint8_t REG_DCCTRL		= 0x6E; | ||||||
|  | constexpr uint8_t REG_DRV_STATUS	= 0x6F; | ||||||
|  | constexpr uint8_t REG_PWMCONF		= 0x70; | ||||||
|  | constexpr uint8_t REG_PWM_SCALE		= 0x71; | ||||||
|  | constexpr uint8_t REG_ENCM_CTRL		= 0x72; | ||||||
|  | constexpr uint8_t REG_LOST_STEPS	= 0x73; | ||||||
|  | 
 | ||||||
|  | // SPI_STATUS
 | ||||||
|  | constexpr uint8_t RESET_FLAG_bp		= 0; | ||||||
|  | constexpr uint8_t DRIVER_ERROR_bp	= 1; | ||||||
|  | constexpr uint8_t SG2_bp 			= 2; | ||||||
|  | constexpr uint8_t STANDSTILL_bp		= 3; | ||||||
|  | constexpr uint32_t RESET_FLAG_bm	= 0x1UL; | ||||||
|  | constexpr uint32_t DRIVER_ERROR_bm	= 0x2UL; | ||||||
|  | constexpr uint32_t SG2_bm 			= 0x4UL; | ||||||
|  | constexpr uint32_t STANDSTILL_bm	= 0x8UL; | ||||||
|  | 
 | ||||||
|  | // GCONF
 | ||||||
|  | constexpr uint8_t I_SCALE_ANALOG_bp			= 0; | ||||||
|  | constexpr uint8_t INTERNAL_RSENSE_bp		= 1; | ||||||
|  | constexpr uint8_t EN_PWM_MODE_bp			= 2; | ||||||
|  | constexpr uint8_t ENC_COMMUTATION_bp		= 3; | ||||||
|  | constexpr uint8_t SHAFT_bp					= 4; | ||||||
|  | constexpr uint8_t DIAG0_ERROR_bp			= 5; | ||||||
|  | constexpr uint8_t DIAG0_OTPW_bp				= 6; | ||||||
|  | constexpr uint8_t DIAG0_STALL_bp			= 7; | ||||||
|  | constexpr uint8_t DIAG1_STALL_bp			= 8; | ||||||
|  | constexpr uint8_t DIAG1_INDEX_bp			= 9; | ||||||
|  | constexpr uint8_t DIAG1_ONSTATE_bp	   		= 10; | ||||||
|  | constexpr uint8_t DIAG1_STEPS_SKIPPED_bp 	= 11; | ||||||
|  | constexpr uint8_t DIAG0_INT_PUSHPULL_bp  	= 12; | ||||||
|  | constexpr uint8_t DIAG1_PUSHPULL_bp	   		= 13; | ||||||
|  | constexpr uint8_t SMALL_HYSTERISIS_bp    	= 14; | ||||||
|  | constexpr uint8_t STOP_ENABLE_bp		   	= 15; | ||||||
|  | constexpr uint8_t DIRECT_MODE_bp		   	= 16; | ||||||
|  | constexpr uint32_t GCONF_bm					= 0x3FFFFUL; | ||||||
|  | constexpr uint32_t I_SCALE_ANALOG_bm		= 0x1UL; | ||||||
|  | constexpr uint32_t INTERNAL_RSENSE_bm		= 0x2UL; | ||||||
|  | constexpr uint32_t EN_PWM_MODE_bm			= 0x4UL; | ||||||
|  | constexpr uint32_t ENC_COMMUTATION_bm		= 0x8UL; | ||||||
|  | constexpr uint32_t SHAFT_bm					= 0x10UL; | ||||||
|  | constexpr uint32_t DIAG0_ERROR_bm			= 0x20UL; | ||||||
|  | constexpr uint32_t DIAG0_OTPW_bm			= 0x40UL; | ||||||
|  | constexpr uint32_t DIAG0_STALL_bm			= 0x80UL; | ||||||
|  | constexpr uint32_t DIAG1_STALL_bm			= 0x100UL; | ||||||
|  | constexpr uint32_t DIAG1_INDEX_bm			= 0x200UL; | ||||||
|  | constexpr uint32_t DIAG1_ONSTATE_bm			= 0x400UL; | ||||||
|  | constexpr uint32_t DIAG1_STEPS_SKIPPED_bm	= 0x800UL; | ||||||
|  | constexpr uint32_t DIAG0_INT_PUSHPULL_bm	= 0x1000UL; | ||||||
|  | constexpr uint32_t DIAG1_PUSHPULL_bm		= 0x2000UL; | ||||||
|  | constexpr uint32_t SMALL_HYSTERISIS_bm		= 0x4000UL; | ||||||
|  | constexpr uint32_t STOP_ENABLE_bm			= 0x8000UL; | ||||||
|  | constexpr uint32_t DIRECT_MODE_bm			= 0x10000UL; | ||||||
|  | // GSTAT
 | ||||||
|  | constexpr uint8_t RESET_bp 			= 0; | ||||||
|  | constexpr uint8_t DRV_ERR_bp		= 1; | ||||||
|  | constexpr uint8_t UV_CP_bp			= 2; | ||||||
|  | constexpr uint32_t GSTAT_bm			= 0x7UL; | ||||||
|  | constexpr uint32_t RESET_bm 		= 0b1UL; | ||||||
|  | constexpr uint32_t DRV_ERR_bm		= 0b10UL; | ||||||
|  | constexpr uint32_t UV_CP_bm			= 0b100UL; | ||||||
|  | // IOIN
 | ||||||
|  | constexpr uint8_t STEP_bp 			= 0; | ||||||
|  | constexpr uint8_t DIR_bp			= 1; | ||||||
|  | constexpr uint8_t DCEN_CFG4_bp		= 2; | ||||||
|  | constexpr uint8_t DCIN_CFG5_bp		= 3; | ||||||
|  | constexpr uint8_t DRV_ENN_CFG6_bp	= 4; | ||||||
|  | constexpr uint8_t DCO_bp 			= 5; | ||||||
|  | constexpr uint8_t VERSION_bp		= 24; | ||||||
|  | constexpr uint32_t IOIN_bm			= 0xFF00003FUL; | ||||||
|  | constexpr uint32_t STEP_bm 			= 0x1UL; | ||||||
|  | constexpr uint32_t DIR_bm			= 0x2UL; | ||||||
|  | constexpr uint32_t DCEN_CFG4_bm		= 0x4UL; | ||||||
|  | constexpr uint32_t DCIN_CFG5_bm		= 0x8UL; | ||||||
|  | constexpr uint32_t DRV_ENN_CFG6_bm	= 0x10UL; | ||||||
|  | constexpr uint32_t DCO_bm 			= 0x20UL; | ||||||
|  | constexpr uint32_t VERSION_bm		= 0xFF000000UL; | ||||||
|  | // IHOLD_IRUN
 | ||||||
|  | constexpr uint8_t IHOLD_bp 			= 0; | ||||||
|  | constexpr uint8_t IRUN_bp			= 8; | ||||||
|  | constexpr uint8_t IHOLDDELAY_bp	    = 16; | ||||||
|  | constexpr uint32_t IHOLD_IRUN_bm	= 0xF1F1FUL; | ||||||
|  | constexpr uint32_t IHOLD_bm 		= 0x1FUL; | ||||||
|  | constexpr uint32_t IRUN_bm			= 0x1F00UL; | ||||||
|  | constexpr uint32_t IHOLDDELAY_bm	= 0xF0000UL; | ||||||
|  | // TPOWERDOWN
 | ||||||
|  | constexpr uint8_t TPOWERDOWN_bp		= 0; | ||||||
|  | constexpr uint32_t TPOWERDOWN_bm	= 0xFFUL; | ||||||
|  | // TSTEP
 | ||||||
|  | constexpr uint8_t TSTEP_bp			= 0; | ||||||
|  | constexpr uint32_t TSTEP_bm			= 0xFFFFFUL; | ||||||
|  | // TPWMTHRS
 | ||||||
|  | constexpr uint8_t TPWMTHRS_bp 		= 0; | ||||||
|  | constexpr uint32_t TPWMTHRS_bm		= 0xFFFFFUL; | ||||||
|  | // TCOOLTHRS
 | ||||||
|  | constexpr uint8_t TCOOLTHRS_bp		= 0; | ||||||
|  | constexpr uint32_t TCOOLTHRS_bm		= 0xFFFFFUL; | ||||||
|  | // THIGH
 | ||||||
|  | constexpr uint8_t THIGH_bp 			= 0; | ||||||
|  | constexpr uint32_t THIGH_bm			= 0xFFFFFUL; | ||||||
|  | // XDIRECT
 | ||||||
|  | constexpr uint8_t XDIRECT_bp		= 0; | ||||||
|  | constexpr uint32_t XDIRECT_bm		= 0xFFFFFFFFUL; | ||||||
|  | constexpr uint8_t COIL_A_bp			= 0; | ||||||
|  | constexpr uint8_t COIL_B_bp			= 16; | ||||||
|  | constexpr uint32_t COIL_A_bm		= 0x1FFUL; | ||||||
|  | constexpr uint32_t COIL_B_bm		= 0x1FF0000UL; | ||||||
|  | // VDCMIN
 | ||||||
|  | constexpr uint8_t VDCMIN_bp			= 0; | ||||||
|  | constexpr uint32_t VDCMIN_bm		= 0x7FFFFFUL; | ||||||
|  | // MSLUT0
 | ||||||
|  | constexpr uint8_t MSLUT0_bp			= 0; | ||||||
|  | constexpr uint32_t MSLUT0_bm		= 0xFFFFFFFFUL; | ||||||
|  | // MSLUT1
 | ||||||
|  | constexpr uint8_t MSLUT1_bp			= 0; | ||||||
|  | constexpr uint32_t MSLUT1_bm		= 0xFFFFFFFFUL; | ||||||
|  | // MSLUT2
 | ||||||
|  | constexpr uint8_t MSLUT2_bp			= 0; | ||||||
|  | constexpr uint32_t MSLUT2_bm		= 0xFFFFFFFFUL; | ||||||
|  | // MSLUT3
 | ||||||
|  | constexpr uint8_t MSLUT3_bp			= 0; | ||||||
|  | constexpr uint32_t MSLUT3_bm		= 0xFFFFFFFFUL; | ||||||
|  | // MSLUT4
 | ||||||
|  | constexpr uint8_t MSLUT4_bp			= 0; | ||||||
|  | constexpr uint32_t MSLUT4_bm		= 0xFFFFFFFFUL; | ||||||
|  | // MSLUT5
 | ||||||
|  | constexpr uint8_t MSLUT5_bp			= 0; | ||||||
|  | constexpr uint32_t MSLUT5_bm		= 0xFFFFFFFFUL; | ||||||
|  | // MSLUT6
 | ||||||
|  | constexpr uint8_t MSLUT6_bp			= 0; | ||||||
|  | constexpr uint32_t MSLUT6_bm		= 0xFFFFFFFFUL; | ||||||
|  | // MSLUT7
 | ||||||
|  | constexpr uint8_t MSLUT7_bp			= 0; | ||||||
|  | constexpr uint32_t MSLUT7_bm		= 0xFFFFFFFFUL; | ||||||
|  | // MSLUTSEL
 | ||||||
|  | constexpr uint8_t MSLUTSEL_bp		= 0; | ||||||
|  | constexpr uint32_t MSLUTSEL_bm		= 0xFFFFFFFFUL; | ||||||
|  | // MSLUTSTART
 | ||||||
|  | constexpr uint8_t START_SIN_bp		= 0; | ||||||
|  | constexpr uint8_t START_SIN90_bp	= 16; | ||||||
|  | constexpr uint32_t START_SIN_bm 	= 0xFFUL; | ||||||
|  | constexpr uint32_t START_SIN90_bm 	= 0xFF0000UL; | ||||||
|  | // MSCNT
 | ||||||
|  | constexpr uint8_t MSCNT_bp			= 0; | ||||||
|  | constexpr uint32_t MSCNT_bm			= 0x3FFUL; | ||||||
|  | // MSCURACT
 | ||||||
|  | constexpr uint8_t CUR_A_bp			= 0; | ||||||
|  | constexpr uint8_t CUR_B_bp		    = 16; | ||||||
|  | constexpr uint32_t CUR_A_bm			= 0x1FFUL; | ||||||
|  | constexpr uint32_t CUR_B_bm			= 0x1FF0000UL; | ||||||
|  | // CHOPCONF
 | ||||||
|  | constexpr uint8_t TOFF_bp			= 0; | ||||||
|  | constexpr uint8_t HSTRT_bp			= 4; | ||||||
|  | constexpr uint8_t FD_bp				= 4; | ||||||
|  | constexpr uint8_t HEND_bp			= 7; | ||||||
|  | constexpr uint8_t DISFDCC_bp		= 12; | ||||||
|  | constexpr uint8_t RNDTF_bp			= 13; | ||||||
|  | constexpr uint8_t CHM_bp			= 14; | ||||||
|  | constexpr uint8_t TBL_bp			= 15; | ||||||
|  | constexpr uint8_t VSENSE_bp			= 17; | ||||||
|  | constexpr uint8_t VHIGHFS_bp		= 18; | ||||||
|  | constexpr uint8_t VHIGHCHM_bp		= 19; | ||||||
|  | constexpr uint8_t SYNC_bp			= 20; | ||||||
|  | constexpr uint8_t MRES_bp			= 24; | ||||||
|  | constexpr uint8_t INTPOL_bp			= 28; | ||||||
|  | constexpr uint8_t DEDGE_bp			= 29; | ||||||
|  | constexpr uint8_t DISS2G_bp			= 30; | ||||||
|  | constexpr uint32_t CHOPCONF_bm		= 0xFFFFFFFFUL; | ||||||
|  | constexpr uint32_t TOFF_bm			= 0xFUL; | ||||||
|  | constexpr uint32_t HSTRT_bm		 	= 0x70UL; | ||||||
|  | constexpr uint32_t FD_bm			= 0x830UL; | ||||||
|  | constexpr uint32_t HEND_bm			= 0x780UL; | ||||||
|  | constexpr uint32_t DISFDCC_bm		= 0x1000UL; | ||||||
|  | constexpr uint32_t RNDTF_bm			= 0x2000UL; | ||||||
|  | constexpr uint32_t CHM_bm			= 0x4000UL; | ||||||
|  | constexpr uint32_t TBL_bm		  	= 0x18000UL; | ||||||
|  | constexpr uint32_t VSENSE_bm	  	= 0x20000UL; | ||||||
|  | constexpr uint32_t VHIGHFS_bm		= 0x40000UL; | ||||||
|  | constexpr uint32_t VHIGHCHM_bm		= 0x80000UL; | ||||||
|  | constexpr uint32_t SYNC_bm			= 0xF00000UL; | ||||||
|  | constexpr uint32_t MRES_bm			= 0xF000000UL; | ||||||
|  | constexpr uint32_t INTPOL_bm  		= 0x10000000UL; | ||||||
|  | constexpr uint32_t DEDGE_bm   		= 0x20000000UL; | ||||||
|  | constexpr uint32_t DISS2G_bm  		= 0x40000000UL; | ||||||
|  | // COOLCONF
 | ||||||
|  | constexpr uint8_t SEMIN_bp			= 0; | ||||||
|  | constexpr uint8_t SEUP_bp			= 5; | ||||||
|  | constexpr uint8_t SEMAX_bp			= 8; | ||||||
|  | constexpr uint8_t SEDN_bp			= 13; | ||||||
|  | constexpr uint8_t SEIMIN_bp			= 15; | ||||||
|  | constexpr uint8_t SGT_bp			= 16; | ||||||
|  | constexpr uint8_t SFILT_bp			= 24; | ||||||
|  | constexpr uint32_t COOLCONF_bm		= 0x3FFFFFFUL; | ||||||
|  | constexpr uint32_t SEMIN_bm			= 0xFUL; | ||||||
|  | constexpr uint32_t SEUP_bm			= 0x60UL; | ||||||
|  | constexpr uint32_t SEMAX_bm			= 0xF00UL; | ||||||
|  | constexpr uint32_t SEDN_bm			= 0x6000UL; | ||||||
|  | constexpr uint32_t SEIMIN_bm		= 0x8000UL; | ||||||
|  | constexpr uint32_t SGT_bm			= 0x7F0000UL; | ||||||
|  | constexpr uint32_t SFILT_bm			= 0x1000000UL; | ||||||
|  | // DCCTRL
 | ||||||
|  | constexpr uint8_t DC_TIME_bp		= 0; | ||||||
|  | constexpr uint8_t DC_SG_bp			= 16; | ||||||
|  | constexpr uint32_t DC_TIME_bm		= 0x3FFUL; | ||||||
|  | constexpr uint32_t DC_SG_bm			= 0xFF0000UL; | ||||||
|  | // DRV_STATUS
 | ||||||
|  | constexpr uint8_t SG_RESULT_bp		= 0; | ||||||
|  | constexpr uint8_t FSACTIVE_bp		= 15; | ||||||
|  | constexpr uint8_t CS_ACTUAL_bp		= 16; | ||||||
|  | constexpr uint8_t STALLGUARD_bp		= 24; | ||||||
|  | constexpr uint8_t OT_bp				= 25; | ||||||
|  | constexpr uint8_t OTPW_bp			= 26; | ||||||
|  | constexpr uint8_t S2GA_bp			= 27; | ||||||
|  | constexpr uint8_t S2GB_bp			= 28; | ||||||
|  | constexpr uint8_t OLA_bp			= 29; | ||||||
|  | constexpr uint8_t OLB_bp			= 30; | ||||||
|  | constexpr uint8_t STST_bp			= 31; | ||||||
|  | constexpr uint32_t DRV_STATUS_bm	= 0xFFFFFFFFUL; | ||||||
|  | constexpr uint32_t SG_RESULT_bm		= 0x3FFUL; | ||||||
|  | constexpr uint32_t FSACTIVE_bm		= 0x8000UL; | ||||||
|  | constexpr uint32_t CS_ACTUAL_bm		= 0x1F0000UL; | ||||||
|  | constexpr uint32_t STALLGUARD_bm	= 0x1000000UL; | ||||||
|  | constexpr uint32_t OT_bm			= 0x2000000UL; | ||||||
|  | constexpr uint32_t OTPW_bm			= 0x4000000UL; | ||||||
|  | constexpr uint32_t S2GA_bm			= 0x8000000UL; | ||||||
|  | constexpr uint32_t S2GB_bm			= 0x10000000UL; | ||||||
|  | constexpr uint32_t OLA_bm			= 0x20000000UL; | ||||||
|  | constexpr uint32_t OLB_bm			= 0x40000000UL; | ||||||
|  | constexpr uint32_t STST_bm			= 0x80000000UL; | ||||||
|  | // PWMCONF
 | ||||||
|  | constexpr uint8_t PWM_AMPL_bp 		= 0; | ||||||
|  | constexpr uint8_t PWM_GRAD_bp 		= 8; | ||||||
|  | constexpr uint8_t PWM_FREQ_bp 		= 16; | ||||||
|  | constexpr uint8_t PWM_AUTOSCALE_bp  = 18; | ||||||
|  | constexpr uint8_t PWM_SYMMETRIC_bp  = 19; | ||||||
|  | constexpr uint8_t FREEWHEEL_bp 		= 20; | ||||||
|  | constexpr uint32_t PWMCONF_bm		= 0x7FFFFFUL; | ||||||
|  | constexpr uint32_t PWM_AMPL_bm 		= 0xFFUL; | ||||||
|  | constexpr uint32_t PWM_GRAD_bm 		= 0xFF00UL; | ||||||
|  | constexpr uint32_t PWM_FREQ_bm 		= 0x30000UL; | ||||||
|  | constexpr uint32_t PWM_AUTOSCALE_bm	= 0x40000UL; | ||||||
|  | constexpr uint32_t PWM_SYMMETRIC_bm	= 0x80000UL; | ||||||
|  | constexpr uint32_t FREEWHEEL_bm 	= 0x300000UL; | ||||||
|  | // PWM_SCALE
 | ||||||
|  | constexpr uint8_t PWM_SCALE_bp		= 0; | ||||||
|  | constexpr uint32_t PWM_SCALE_bm		= 0xFFUL; | ||||||
|  | // ENCM_CTRL
 | ||||||
|  | constexpr uint8_t INV_bp			= 0; | ||||||
|  | constexpr uint8_t MAXSPEED_bp		= 1; | ||||||
|  | constexpr uint32_t INV_bm			= 0x1UL; | ||||||
|  | constexpr uint32_t MAXSPEED_bm		= 0x2UL; | ||||||
|  | // LOST_STEPS
 | ||||||
|  | constexpr uint8_t LOST_STEPS_bp		= 0; | ||||||
|  | constexpr uint32_t LOST_STEPS_bm	= 0xFFFFFUL; | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
| @ -0,0 +1,33 @@ | |||||||
|  | #ifndef TMC2130Stepper_UTILITY_h | ||||||
|  | #define TMC2130Stepper_UTILITY_h | ||||||
|  | 
 | ||||||
|  | void print_HEX(uint32_t data) { | ||||||
|  |   for(uint8_t B=24; B>=4; B-=8){ | ||||||
|  |     Serial.print((data>>(B+4))&0xF, HEX); | ||||||
|  |     Serial.print((data>>B)&0xF, HEX); | ||||||
|  |     Serial.print(":"); | ||||||
|  |   } | ||||||
|  |   Serial.print((data>>4)&0xF, HEX); | ||||||
|  |   Serial.print(data&0xF, HEX); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void print_BIN(uint32_t data) { | ||||||
|  |   int b = 31; | ||||||
|  |   for(; b>=24; b--){ | ||||||
|  |     Serial.print((data>>b)&0b1); | ||||||
|  |   } | ||||||
|  |   Serial.print("."); | ||||||
|  |   for(; b>=16; b--){ | ||||||
|  |     Serial.print((data>>b)&0b1); | ||||||
|  |   } | ||||||
|  |   Serial.print("."); | ||||||
|  |   for(; b>=8; b--){ | ||||||
|  |     Serial.print((data>>b)&0b1); | ||||||
|  |   } | ||||||
|  |   Serial.print("."); | ||||||
|  |   for(; b>=0; b--){ | ||||||
|  |     Serial.print((data>>b)&0b1); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
| @ -0,0 +1,309 @@ | |||||||
|  | #include <SPI.h> | ||||||
|  | #include "TMC2130Stepper.h" | ||||||
|  | #include "TMC2130Stepper_MACROS.h" | ||||||
|  | 
 | ||||||
|  | TMC2130Stepper::TMC2130Stepper(uint8_t pinEN, uint8_t pinDIR, uint8_t pinStep, uint8_t pinCS) { | ||||||
|  | 	_started = false; | ||||||
|  | 
 | ||||||
|  | 	this->_pinEN = pinEN; | ||||||
|  | 	this->_pinDIR = pinDIR; | ||||||
|  | 	this->_pinSTEP = pinStep; | ||||||
|  | 	this->_pinCS = pinCS; | ||||||
|  | 
 | ||||||
|  | 	begin(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TMC2130Stepper::begin() { | ||||||
|  | #ifdef TMC2130DEBUG | ||||||
|  | 	Serial.println("TMC2130 Stepper driver library"); | ||||||
|  | 	Serial.print("Enable pin: "); | ||||||
|  | 	Serial.println(_pinEN); | ||||||
|  | 	Serial.print("Direction pin: "); | ||||||
|  | 	Serial.println(_pinDIR); | ||||||
|  | 	Serial.print("Step pin: "); | ||||||
|  | 	Serial.println(_pinSTEP); | ||||||
|  | 	Serial.print("Chip select pin: "); | ||||||
|  | 	Serial.println(_pinCS); | ||||||
|  | #endif | ||||||
|  | 	//set pins
 | ||||||
|  | 	pinMode(_pinEN, OUTPUT); | ||||||
|  | 	pinMode(_pinDIR, OUTPUT); | ||||||
|  | 	pinMode(_pinSTEP, OUTPUT); | ||||||
|  | 	pinMode(_pinCS, OUTPUT); | ||||||
|  | 	digitalWrite(_pinEN, HIGH); //deactivate driver (LOW active)
 | ||||||
|  | 	digitalWrite(_pinDIR, LOW); //LOW or HIGH
 | ||||||
|  | 	digitalWrite(_pinSTEP, LOW); | ||||||
|  | 	digitalWrite(_pinCS, HIGH); | ||||||
|  | /*
 | ||||||
|  | 	pinMode(MOSI, OUTPUT); | ||||||
|  | 	pinMode(MISO, INPUT); | ||||||
|  | 	pinMode(SCK, OUTPUT); | ||||||
|  | 	digitalWrite(MOSI, LOW); | ||||||
|  | 	digitalWrite(MISO, HIGH); | ||||||
|  | 	digitalWrite(SCK, LOW); | ||||||
|  | 
 | ||||||
|  | 	SPI.begin(); | ||||||
|  | */ | ||||||
|  | 	GCONF(GCONF_sr); | ||||||
|  | 	CHOPCONF(CHOPCONF_sr); | ||||||
|  | 	COOLCONF(COOLCONF_sr); | ||||||
|  | 	PWMCONF(PWMCONF_sr); | ||||||
|  | 	IHOLD_IRUN(IHOLD_IRUN_sr); | ||||||
|  | 
 | ||||||
|  | 	toff(8); //off_time(8);
 | ||||||
|  | 	tbl(1); //blank_time(24);
 | ||||||
|  | 
 | ||||||
|  | 	_started = true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //uint32_t TMC2130Stepper::send2130(uint8_t addressByte, uint32_t *config, uint32_t value, uint32_t mask) {
 | ||||||
|  | void TMC2130Stepper::send2130(uint8_t addressByte, uint32_t *config) { | ||||||
|  | 	//uint8_t s;
 | ||||||
|  | 	SPI.begin(); | ||||||
|  | 	SPI.beginTransaction(SPISettings(16000000/8, MSBFIRST, SPI_MODE3)); | ||||||
|  | 	digitalWrite(_pinCS, LOW); | ||||||
|  | 
 | ||||||
|  | 	status_response = SPI.transfer(addressByte & 0xFF); // s = 
 | ||||||
|  | 	#ifdef TMC2130DEBUG | ||||||
|  | 		Serial.println("## Received parameters:"); | ||||||
|  | 		Serial.print("## Address byte: "); | ||||||
|  | 		Serial.println(addressByte, HEX); | ||||||
|  | 		Serial.print("## Config: "); | ||||||
|  | 		Serial.println(*config, BIN); | ||||||
|  | 		Serial.print("## status_response: "); | ||||||
|  | 		Serial.println(status_response, BIN); | ||||||
|  | 	#endif | ||||||
|  | 
 | ||||||
|  | 	if (addressByte >> 7) { // Check if WRITE command
 | ||||||
|  | 		//*config &= ~mask; // Clear bits being set
 | ||||||
|  | 		//*config |= (value & mask); // Set new values
 | ||||||
|  | 		SPI.transfer((*config >> 24) & 0xFF); | ||||||
|  | 		SPI.transfer((*config >> 16) & 0xFF); | ||||||
|  | 		SPI.transfer((*config >>  8) & 0xFF); | ||||||
|  | 		SPI.transfer(*config & 0xFF); | ||||||
|  | 		#ifdef TMC2130DEBUG | ||||||
|  | 			Serial.println("## WRITE cmd"); | ||||||
|  | 			Serial.println("##########################"); | ||||||
|  | 		#endif | ||||||
|  | 	} else { // READ command
 | ||||||
|  | 		SPI.transfer16(0x0000); // Clear SPI
 | ||||||
|  | 		SPI.transfer16(0x0000); | ||||||
|  | 		digitalWrite(_pinCS, HIGH); | ||||||
|  | 		digitalWrite(_pinCS, LOW); | ||||||
|  | 
 | ||||||
|  | 		SPI.transfer(addressByte & 0xFF); // Send the address byte again
 | ||||||
|  | 		*config  = SPI.transfer(0x00); | ||||||
|  | 		*config <<= 8; | ||||||
|  | 		*config |= SPI.transfer(0x00); | ||||||
|  | 		*config <<= 8; | ||||||
|  | 		*config |= SPI.transfer(0x00); | ||||||
|  | 		*config <<= 8; | ||||||
|  | 		*config |= SPI.transfer(0x00); | ||||||
|  | 		#ifdef TMC2130DEBUG | ||||||
|  | 			Serial.println("## READ cmd"); | ||||||
|  | 			Serial.print("## Received config: "); | ||||||
|  | 			Serial.println(*config, BIN); | ||||||
|  | 			Serial.println("##########################"); | ||||||
|  | 		#endif | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	digitalWrite(_pinCS, HIGH); | ||||||
|  | 	SPI.endTransaction(); | ||||||
|  | 
 | ||||||
|  | 	//return s;
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool TMC2130Stepper::checkOT() { | ||||||
|  | 	uint32_t response = DRV_STATUS(); | ||||||
|  | 	if (response & OTPW_bm) { | ||||||
|  | 		flag_otpw = 1; | ||||||
|  | 		return true; // bit 26 for overtemperature warning flag
 | ||||||
|  | 	} | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool TMC2130Stepper::getOTPW() { return flag_otpw; } | ||||||
|  | 
 | ||||||
|  | void TMC2130Stepper::clear_otpw() {	flag_otpw = 0; } | ||||||
|  | 
 | ||||||
|  | bool TMC2130Stepper::isEnabled() { return !digitalRead(_pinEN) && toff(); } | ||||||
|  | 
 | ||||||
|  | ///////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | // R+C: GSTAT
 | ||||||
|  | void 	TMC2130Stepper::GSTAT(uint8_t input){ | ||||||
|  | 	GSTAT_sr = input; | ||||||
|  | 	WRITE_REG(GSTAT); | ||||||
|  | } | ||||||
|  | uint8_t TMC2130Stepper::GSTAT()			 	{ READ_REG_R(GSTAT); 		} | ||||||
|  | bool 	TMC2130Stepper::reset()				{ GET_BYTE(GSTAT, RESET);	} | ||||||
|  | bool 	TMC2130Stepper::drv_err()			{ GET_BYTE(GSTAT, DRV_ERR);	} | ||||||
|  | bool 	TMC2130Stepper::uv_cp()				{ GET_BYTE(GSTAT, UV_CP);	} | ||||||
|  | ///////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | // R: IOIN
 | ||||||
|  | uint32_t 	TMC2130Stepper::IOIN() 			{ READ_REG_R(IOIN); 				} | ||||||
|  | bool 		TMC2130Stepper::step()			{ GET_BYTE_R(IOIN, STEP);			} | ||||||
|  | bool 		TMC2130Stepper::dir()			{ GET_BYTE_R(IOIN, DIR);			} | ||||||
|  | bool 		TMC2130Stepper::dcen_cfg4()		{ GET_BYTE_R(IOIN, DCEN_CFG4);		} | ||||||
|  | bool 		TMC2130Stepper::dcin_cfg5()		{ GET_BYTE_R(IOIN, DCIN_CFG5);		} | ||||||
|  | bool 		TMC2130Stepper::drv_enn_cfg6()	{ GET_BYTE_R(IOIN, DRV_ENN_CFG6);	} | ||||||
|  | bool 		TMC2130Stepper::dco()			{ GET_BYTE_R(IOIN, DCO);			} | ||||||
|  | uint8_t 	TMC2130Stepper::version() 		{ GET_BYTE_R(IOIN, VERSION);		} | ||||||
|  | ///////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | // W: TPOWERDOWN
 | ||||||
|  | uint32_t TMC2130Stepper::TPOWERDOWN() { return TPOWERDOWN_sr; } | ||||||
|  | void TMC2130Stepper::TPOWERDOWN(uint32_t input) { | ||||||
|  | 	TPOWERDOWN_sr = input; | ||||||
|  | 	WRITE_REG(TPOWERDOWN); | ||||||
|  | } | ||||||
|  | ///////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | // R: TSTEP
 | ||||||
|  | uint32_t TMC2130Stepper::TSTEP() { READ_REG_R(TSTEP); } | ||||||
|  | ///////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | // W: TPWMTHRS
 | ||||||
|  | uint32_t TMC2130Stepper::TPWMTHRS() { return TPWMTHRS_sr; } | ||||||
|  | void TMC2130Stepper::TPWMTHRS(uint32_t input) { | ||||||
|  | 	TPWMTHRS_sr = input; | ||||||
|  | 	WRITE_REG(TPWMTHRS); | ||||||
|  | } | ||||||
|  | ///////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | // W: TCOOLTHRS
 | ||||||
|  | uint32_t TMC2130Stepper::TCOOLTHRS() { return TCOOLTHRS_sr; } | ||||||
|  | void TMC2130Stepper::TCOOLTHRS(uint32_t input) { | ||||||
|  | 	TCOOLTHRS_sr = input; | ||||||
|  | 	WRITE_REG(TCOOLTHRS); | ||||||
|  | } | ||||||
|  | ///////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | // W: THIGH
 | ||||||
|  | uint32_t TMC2130Stepper::THIGH() { return THIGH_sr; } | ||||||
|  | void TMC2130Stepper::THIGH(uint32_t input) { | ||||||
|  | 	THIGH_sr = input; | ||||||
|  | 	WRITE_REG(THIGH); | ||||||
|  | } | ||||||
|  | ///////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | // RW: XDIRECT
 | ||||||
|  | uint32_t TMC2130Stepper::XDIRECT() { READ_REG(XDIRECT); } | ||||||
|  | void TMC2130Stepper::XDIRECT(uint32_t input) { | ||||||
|  | 	XDIRECT_sr = input; | ||||||
|  | 	WRITE_REG(XDIRECT); | ||||||
|  | } | ||||||
|  | void TMC2130Stepper::coil_A(int16_t B) 	{ MOD_REG(XDIRECT, COIL_A); 	} | ||||||
|  | void TMC2130Stepper::coil_B(int16_t B) 	{ MOD_REG(XDIRECT, COIL_B); 	} | ||||||
|  | int16_t TMC2130Stepper::coil_A() 		{ GET_BYTE_R(XDIRECT, COIL_A); 	} | ||||||
|  | int16_t TMC2130Stepper::coil_B() 		{ GET_BYTE_R(XDIRECT, COIL_A); 	} | ||||||
|  | ///////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | // W: VDCMIN
 | ||||||
|  | uint32_t TMC2130Stepper::VDCMIN() { return VDCMIN_sr; } | ||||||
|  | void TMC2130Stepper::VDCMIN(uint32_t input) { | ||||||
|  | 	VDCMIN_sr = input; | ||||||
|  | 	WRITE_REG(VDCMIN); | ||||||
|  | } | ||||||
|  | ///////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | // R: PWM_SCALE
 | ||||||
|  | uint8_t TMC2130Stepper::PWM_SCALE() { READ_REG_R(PWM_SCALE); } | ||||||
|  | ///////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | // W: ENCM_CTRL
 | ||||||
|  | uint8_t TMC2130Stepper::ENCM_CTRL() { return ENCM_CTRL_sr; } | ||||||
|  | void TMC2130Stepper::ENCM_CTRL(uint8_t input) { | ||||||
|  | 	ENCM_CTRL_sr = input; | ||||||
|  | 	WRITE_REG(ENCM_CTRL); | ||||||
|  | } | ||||||
|  | void TMC2130Stepper::inv(bool B)		{ MOD_REG(ENCM_CTRL, INV);		} | ||||||
|  | void TMC2130Stepper::maxspeed(bool B)	{ MOD_REG(ENCM_CTRL, MAXSPEED); } | ||||||
|  | bool TMC2130Stepper::inv() 				{ GET_BYTE(ENCM_CTRL, INV); 	} | ||||||
|  | bool TMC2130Stepper::maxspeed() 		{ GET_BYTE(ENCM_CTRL, MAXSPEED);} | ||||||
|  | ///////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | // R: LOST_STEPS
 | ||||||
|  | uint32_t TMC2130Stepper::LOST_STEPS() { READ_REG_R(LOST_STEPS); } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  *	Helper functions | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*	
 | ||||||
|  | 	Requested current = mA = I_rms/1000 | ||||||
|  | 	Equation for current: | ||||||
|  | 	I_rms = (CS+1)/32 * V_fs/(R_sense+0.02ohm) * 1/sqrt(2) | ||||||
|  | 	Solve for CS -> | ||||||
|  | 	CS = 32*sqrt(2)*I_rms*(R_sense+0.02)/V_fs - 1 | ||||||
|  | 	 | ||||||
|  | 	Example: | ||||||
|  | 	vsense = 0b0 -> V_fs = 0.325V | ||||||
|  | 	mA = 1640mA = I_rms/1000 = 1.64A | ||||||
|  | 	R_sense = 0.10 Ohm | ||||||
|  | 	-> | ||||||
|  | 	CS = 32*sqrt(2)*1.64*(0.10+0.02)/0.325 - 1 = 26.4 | ||||||
|  | 	CS = 26 | ||||||
|  | */	 | ||||||
|  | void TMC2130Stepper::rms_current(uint16_t mA, float multiplier, float RS) { | ||||||
|  | 	Rsense = RS; | ||||||
|  | 	uint8_t CS = 32.0*1.41421*mA/1000.0*(Rsense+0.02)/0.325 - 1; | ||||||
|  | 	// If Current Scale is too low, turn on high sensitivity R_sense and calculate again
 | ||||||
|  | 	if (CS < 16) { | ||||||
|  | 		vsense(true); | ||||||
|  | 		CS = 32.0*1.41421*mA/1000.0*(Rsense+0.02)/0.180 - 1; | ||||||
|  | 	} else if(vsense()) { // If CS >= 16, turn off high_sense_r if it's currently ON
 | ||||||
|  | 		vsense(false); | ||||||
|  | 	} | ||||||
|  | 	irun(CS); | ||||||
|  | 	ihold(CS*multiplier); | ||||||
|  | 	val_mA = mA; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint16_t TMC2130Stepper::rms_current() { | ||||||
|  | 	return (float)(irun()+1)/32.0 * (vsense()?0.180:0.325)/(Rsense+0.02) / 1.41421 * 1000; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TMC2130Stepper::setCurrent(uint16_t mA, float R, float multiplier) { rms_current(mA, multiplier, R); } | ||||||
|  | uint16_t TMC2130Stepper::getCurrent() {	return val_mA; } | ||||||
|  | 
 | ||||||
|  | void TMC2130Stepper::SilentStepStick2130(uint16_t current) { rms_current(current); } | ||||||
|  | 
 | ||||||
|  | void TMC2130Stepper::microsteps(uint16_t ms) { | ||||||
|  | 	switch(ms) { | ||||||
|  | 		case 256: mres(0); break; | ||||||
|  | 		case 128: mres(1); break; | ||||||
|  | 		case  64: mres(2); break; | ||||||
|  | 		case  32: mres(3); break; | ||||||
|  | 		case  16: mres(4); break; | ||||||
|  | 		case   8: mres(5); break; | ||||||
|  | 		case   4: mres(6); break; | ||||||
|  | 		case   2: mres(7); break; | ||||||
|  | 		case   0: mres(8); break; | ||||||
|  | 		default: break; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint16_t TMC2130Stepper::microsteps() { | ||||||
|  | 	switch(mres()) { | ||||||
|  | 		case 0: return 256; | ||||||
|  | 		case 1: return 128; | ||||||
|  | 		case 2: return  64; | ||||||
|  | 		case 3: return  32; | ||||||
|  | 		case 4: return  16; | ||||||
|  | 		case 5: return   8; | ||||||
|  | 		case 6: return   4; | ||||||
|  | 		case 7: return   2; | ||||||
|  | 		case 8: return   0; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TMC2130Stepper::sg_current_decrease(uint8_t value) { | ||||||
|  | 	switch(value) { | ||||||
|  | 		case 32: sedn(0b00); break; | ||||||
|  | 		case  8: sedn(0b01); break; | ||||||
|  | 		case  2: sedn(0b10); break; | ||||||
|  | 		case  1: sedn(0b11); break; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | uint8_t TMC2130Stepper::sg_current_decrease() { | ||||||
|  | 	switch(sedn()) { | ||||||
|  | 		case 0b00: return 32; | ||||||
|  | 		case 0b01: return  8; | ||||||
|  | 		case 0b10: return  2; | ||||||
|  | 		case 0b11: return  1; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
| @ -0,0 +1,68 @@ | |||||||
|  | #include "TMC2130Stepper.h" | ||||||
|  | #include "TMC2130Stepper_MACROS.h" | ||||||
|  | 
 | ||||||
|  | // CHOPCONF
 | ||||||
|  | uint32_t TMC2130Stepper::CHOPCONF() { READ_REG(CHOPCONF); } | ||||||
|  | void TMC2130Stepper::CHOPCONF(uint32_t input) { | ||||||
|  | 	CHOPCONF_sr = input; | ||||||
|  | 	WRITE_REG(CHOPCONF); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TMC2130Stepper::toff(		uint8_t B )	{ MOD_REG(CHOPCONF, TOFF);		} | ||||||
|  | void TMC2130Stepper::hstrt(		uint8_t B )	{ MOD_REG(CHOPCONF, HSTRT);		} | ||||||
|  | void TMC2130Stepper::hend(		int8_t  B )	{ MOD_REG(CHOPCONF, HEND);		} | ||||||
|  | void TMC2130Stepper::fd(		uint8_t B )	{ MOD_REG(CHOPCONF, FD);		} | ||||||
|  | void TMC2130Stepper::disfdcc(	bool 	B )	{ MOD_REG(CHOPCONF, DISFDCC);	} | ||||||
|  | void TMC2130Stepper::rndtf(		bool 	B )	{ MOD_REG(CHOPCONF, RNDTF);		} | ||||||
|  | void TMC2130Stepper::chm(		bool 	B )	{ MOD_REG(CHOPCONF, CHM);		} | ||||||
|  | void TMC2130Stepper::tbl(		uint8_t B )	{ MOD_REG(CHOPCONF, TBL);		} | ||||||
|  | void TMC2130Stepper::vsense(	bool 	B )	{ MOD_REG(CHOPCONF, VSENSE);	} | ||||||
|  | void TMC2130Stepper::vhighfs(	bool 	B )	{ MOD_REG(CHOPCONF, VHIGHFS);	} | ||||||
|  | void TMC2130Stepper::vhighchm(	bool 	B )	{ MOD_REG(CHOPCONF, VHIGHCHM);	} | ||||||
|  | void TMC2130Stepper::sync(		uint8_t B )	{ MOD_REG(CHOPCONF, SYNC);		} | ||||||
|  | void TMC2130Stepper::mres(		uint8_t B )	{ MOD_REG(CHOPCONF, MRES);		} | ||||||
|  | void TMC2130Stepper::intpol(	bool 	B )	{ MOD_REG(CHOPCONF, INTPOL);	} | ||||||
|  | void TMC2130Stepper::dedge(		bool 	B )	{ MOD_REG(CHOPCONF, DEDGE);		} | ||||||
|  | void TMC2130Stepper::diss2g(	bool 	B )	{ MOD_REG(CHOPCONF, DISS2G);	} | ||||||
|  | 
 | ||||||
|  | uint8_t TMC2130Stepper::toff()		{ GET_BYTE(CHOPCONF, TOFF);		} | ||||||
|  | uint8_t TMC2130Stepper::hstrt()		{ GET_BYTE(CHOPCONF, HSTRT);	} | ||||||
|  | int8_t  TMC2130Stepper::hend()		{ GET_BYTE(CHOPCONF, HEND);		} | ||||||
|  | uint8_t TMC2130Stepper::fd()		{ GET_BYTE(CHOPCONF, FD);		} | ||||||
|  | bool 	TMC2130Stepper::disfdcc()	{ GET_BYTE(CHOPCONF, DISFDCC);	} | ||||||
|  | bool 	TMC2130Stepper::rndtf()		{ GET_BYTE(CHOPCONF, RNDTF);	} | ||||||
|  | bool 	TMC2130Stepper::chm()		{ GET_BYTE(CHOPCONF, CHM);		} | ||||||
|  | uint8_t TMC2130Stepper::tbl()		{ GET_BYTE(CHOPCONF, TBL);		} | ||||||
|  | bool 	TMC2130Stepper::vsense()	{ GET_BIT( CHOPCONF, VSENSE);	} | ||||||
|  | bool 	TMC2130Stepper::vhighfs()	{ GET_BYTE(CHOPCONF, VHIGHFS);	} | ||||||
|  | bool 	TMC2130Stepper::vhighchm()	{ GET_BYTE(CHOPCONF, VHIGHCHM);	} | ||||||
|  | uint8_t TMC2130Stepper::sync()		{ GET_BYTE(CHOPCONF, SYNC);		} | ||||||
|  | uint8_t TMC2130Stepper::mres()		{ GET_BYTE(CHOPCONF, MRES);		} | ||||||
|  | bool 	TMC2130Stepper::intpol()	{ GET_BYTE(CHOPCONF, INTPOL);	} | ||||||
|  | bool 	TMC2130Stepper::dedge()		{ GET_BYTE(CHOPCONF, DEDGE);	} | ||||||
|  | bool 	TMC2130Stepper::diss2g()	{ GET_BYTE(CHOPCONF, DISS2G);	} | ||||||
|  | 
 | ||||||
|  | void TMC2130Stepper::hysterisis_end(int8_t value) { hend(value+3); } | ||||||
|  | int8_t TMC2130Stepper::hysterisis_end() { return hend()-3; }; | ||||||
|  | 
 | ||||||
|  | void TMC2130Stepper::hysterisis_start(uint8_t value) { hstrt(value-1); } | ||||||
|  | uint8_t TMC2130Stepper::hysterisis_start() { return hstrt()+1; } | ||||||
|  | 
 | ||||||
|  | void TMC2130Stepper::blank_time(uint8_t value) { | ||||||
|  | 	switch (value) { | ||||||
|  | 		case 16: tbl(0b00); break; | ||||||
|  | 		case 24: tbl(0b01); break; | ||||||
|  | 		case 36: tbl(0b10); break; | ||||||
|  | 		case 54: tbl(0b11); break; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t TMC2130Stepper::blank_time() { | ||||||
|  | 	switch (tbl()) { | ||||||
|  | 		case 0b00: return 16; | ||||||
|  | 		case 0b01: return 24; | ||||||
|  | 		case 0b10: return 36; | ||||||
|  | 		case 0b11: return 54; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
| @ -0,0 +1,25 @@ | |||||||
|  | #include "TMC2130Stepper.h" | ||||||
|  | #include "TMC2130Stepper_MACROS.h" | ||||||
|  | 
 | ||||||
|  | // COOLCONF
 | ||||||
|  | uint32_t TMC2130Stepper::COOLCONF() { return COOLCONF_sr; } | ||||||
|  | void TMC2130Stepper::COOLCONF(uint32_t input) { | ||||||
|  | 	COOLCONF_sr = input; | ||||||
|  | 	WRITE_REG(COOLCONF); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TMC2130Stepper::semin(		uint8_t B )	{ MOD_REG(COOLCONF, SEMIN);		} | ||||||
|  | void TMC2130Stepper::seup(		uint8_t B )	{ MOD_REG(COOLCONF, SEUP);		} | ||||||
|  | void TMC2130Stepper::semax(		uint8_t B )	{ MOD_REG(COOLCONF, SEMAX);		} | ||||||
|  | void TMC2130Stepper::sedn(		uint8_t B )	{ MOD_REG(COOLCONF, SEDN);		} | ||||||
|  | void TMC2130Stepper::seimin(	bool 	B )	{ MOD_REG(COOLCONF, SEIMIN);	} | ||||||
|  | void TMC2130Stepper::sgt(		uint8_t B )	{ MOD_REG(COOLCONF, SGT);		} | ||||||
|  | void TMC2130Stepper::sfilt(		bool 	B )	{ MOD_REG(COOLCONF, SFILT);		} | ||||||
|  | 
 | ||||||
|  | uint8_t TMC2130Stepper::semin()	{ GET_BYTE(COOLCONF, SEMIN);	} | ||||||
|  | uint8_t TMC2130Stepper::seup()	{ GET_BYTE(COOLCONF, SEUP);		} | ||||||
|  | uint8_t TMC2130Stepper::semax()	{ GET_BYTE(COOLCONF, SEMAX);	} | ||||||
|  | uint8_t TMC2130Stepper::sedn()	{ GET_BYTE(COOLCONF, SEDN);		} | ||||||
|  | bool TMC2130Stepper::seimin()	{ GET_BYTE(COOLCONF, SEIMIN);	} | ||||||
|  | uint8_t TMC2130Stepper::sgt()	{ GET_BYTE(COOLCONF, SGT);		} | ||||||
|  | bool TMC2130Stepper::sfilt()	{ GET_BYTE(COOLCONF, SFILT);	} | ||||||
| @ -0,0 +1,29 @@ | |||||||
|  | #include "TMC2130Stepper.h" | ||||||
|  | #include "TMC2130Stepper_MACROS.h" | ||||||
|  | 
 | ||||||
|  | uint32_t TMC2130Stepper::DRV_STATUS() { READ_REG_R(DRV_STATUS); } | ||||||
|  | 
 | ||||||
|  | uint16_t TMC2130Stepper::sg_result(){ GET_BYTE_R(DRV_STATUS, SG_RESULT); 	} | ||||||
|  | bool TMC2130Stepper::fsactive()		{ GET_BYTE_R(DRV_STATUS, FSACTIVE); 	} | ||||||
|  | uint8_t TMC2130Stepper::cs_actual()	{ GET_BYTE_R(DRV_STATUS, CS_ACTUAL); 	} | ||||||
|  | bool TMC2130Stepper::stallguard()	{ GET_BYTE_R(DRV_STATUS, STALLGUARD); 	} | ||||||
|  | bool TMC2130Stepper::ot()			{ GET_BYTE_R(DRV_STATUS, OT); 			} | ||||||
|  | bool TMC2130Stepper::otpw()			{ GET_BYTE_R(DRV_STATUS, OTPW); 		} | ||||||
|  | bool TMC2130Stepper::s2ga()			{ GET_BYTE_R(DRV_STATUS, S2GA); 		} | ||||||
|  | bool TMC2130Stepper::s2gb()			{ GET_BYTE_R(DRV_STATUS, S2GB); 		} | ||||||
|  | bool TMC2130Stepper::ola()			{ GET_BYTE_R(DRV_STATUS, OLA); 			} | ||||||
|  | bool TMC2130Stepper::olb()			{ GET_BYTE_R(DRV_STATUS, OLB); 			} | ||||||
|  | bool TMC2130Stepper::stst()			{ GET_BYTE_R(DRV_STATUS, STST); 		} | ||||||
|  | /*
 | ||||||
|  | uint16_t TMC2130Stepper::sg_result()	{ | ||||||
|  | 	uint32_t drv_status = 0x00000000UL; | ||||||
|  | 	Serial.print("drv_status="); | ||||||
|  | 	Serial.print(drv_status); | ||||||
|  | 	drv_status = DRV_STATUS(); | ||||||
|  | 	Serial.print("\tdrv_status="); | ||||||
|  | 	Serial.print(drv_status); | ||||||
|  | 	Serial.print("\t"); | ||||||
|  | 
 | ||||||
|  | 	return drv_status&SG_RESULT_bm; | ||||||
|  | } | ||||||
|  | */ | ||||||
| @ -0,0 +1,54 @@ | |||||||
|  | #include "TMC2130Stepper.h" | ||||||
|  | #include "TMC2130Stepper_MACROS.h" | ||||||
|  | 
 | ||||||
|  | // GCONF
 | ||||||
|  | uint32_t TMC2130Stepper::GCONF() { READ_REG(GCONF); } | ||||||
|  | void TMC2130Stepper::GCONF(uint32_t input) { | ||||||
|  | 	GCONF_sr = input; | ||||||
|  | 	WRITE_REG(GCONF); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TMC2130Stepper::I_scale_analog(bool B)			{ MOD_REG(GCONF, I_SCALE_ANALOG);		} | ||||||
|  | void TMC2130Stepper::internal_Rsense(bool B)		{ MOD_REG(GCONF, INTERNAL_RSENSE);		} | ||||||
|  | void TMC2130Stepper::en_pwm_mode(bool B)			{ MOD_REG(GCONF, EN_PWM_MODE);			} | ||||||
|  | void TMC2130Stepper::enc_commutation(bool B)		{ MOD_REG(GCONF, ENC_COMMUTATION);		} | ||||||
|  | void TMC2130Stepper::shaft(bool B) 					{ MOD_REG(GCONF, SHAFT);				} | ||||||
|  | void TMC2130Stepper::diag0_error(bool B) 			{ MOD_REG(GCONF, DIAG0_ERROR);			} | ||||||
|  | void TMC2130Stepper::diag0_otpw(bool B) 			{ MOD_REG(GCONF, DIAG0_OTPW);			} | ||||||
|  | void TMC2130Stepper::diag0_stall(bool B) 			{ MOD_REG(GCONF, DIAG0_STALL);			} | ||||||
|  | void TMC2130Stepper::diag1_stall(bool B) 			{ MOD_REG(GCONF, DIAG1_STALL);			} | ||||||
|  | void TMC2130Stepper::diag1_index(bool B) 			{ MOD_REG(GCONF, DIAG1_INDEX);			} | ||||||
|  | void TMC2130Stepper::diag1_onstate(bool B) 			{ MOD_REG(GCONF, DIAG1_ONSTATE);		} | ||||||
|  | void TMC2130Stepper::diag1_steps_skipped(bool B) 	{ MOD_REG(GCONF, DIAG1_STEPS_SKIPPED);	} | ||||||
|  | void TMC2130Stepper::diag0_int_pushpull(bool B) 	{ MOD_REG(GCONF, DIAG0_INT_PUSHPULL);	} | ||||||
|  | void TMC2130Stepper::diag1_pushpull(bool B) 		{ MOD_REG(GCONF, DIAG1_PUSHPULL);		} | ||||||
|  | void TMC2130Stepper::small_hysterisis(bool B) 		{ MOD_REG(GCONF, SMALL_HYSTERISIS);		} | ||||||
|  | void TMC2130Stepper::stop_enable(bool B) 			{ MOD_REG(GCONF, STOP_ENABLE);			} | ||||||
|  | void TMC2130Stepper::direct_mode(bool B) 			{ MOD_REG(GCONF, DIRECT_MODE);			} | ||||||
|  | 
 | ||||||
|  | bool TMC2130Stepper::I_scale_analog()				{ GET_BYTE(GCONF, I_SCALE_ANALOG);		} | ||||||
|  | bool TMC2130Stepper::internal_Rsense()				{ GET_BYTE(GCONF, INTERNAL_RSENSE);		} | ||||||
|  | bool TMC2130Stepper::en_pwm_mode()					{ GET_BYTE(GCONF, EN_PWM_MODE);			} | ||||||
|  | bool TMC2130Stepper::enc_commutation()				{ GET_BYTE(GCONF, ENC_COMMUTATION);		} | ||||||
|  | bool TMC2130Stepper::shaft() 						{ GET_BYTE(GCONF, SHAFT);				} | ||||||
|  | bool TMC2130Stepper::diag0_error() 					{ GET_BYTE(GCONF, DIAG0_ERROR);			} | ||||||
|  | bool TMC2130Stepper::diag0_otpw() 					{ GET_BYTE(GCONF, DIAG0_OTPW);			} | ||||||
|  | bool TMC2130Stepper::diag0_stall() 					{ GET_BYTE(GCONF, DIAG0_STALL);			} | ||||||
|  | bool TMC2130Stepper::diag1_stall() 					{ GET_BYTE(GCONF, DIAG1_STALL);			} | ||||||
|  | bool TMC2130Stepper::diag1_index() 					{ GET_BYTE(GCONF, DIAG1_INDEX);			} | ||||||
|  | bool TMC2130Stepper::diag1_onstate() 				{ GET_BYTE(GCONF, DIAG1_ONSTATE);		} | ||||||
|  | bool TMC2130Stepper::diag1_steps_skipped() 			{ GET_BYTE(GCONF, DIAG1_STEPS_SKIPPED);	} | ||||||
|  | bool TMC2130Stepper::diag0_int_pushpull() 			{ GET_BYTE(GCONF, DIAG0_INT_PUSHPULL);	} | ||||||
|  | bool TMC2130Stepper::diag1_pushpull() 				{ GET_BYTE(GCONF, DIAG1_PUSHPULL);		} | ||||||
|  | bool TMC2130Stepper::small_hysterisis() 			{ GET_BYTE(GCONF, SMALL_HYSTERISIS);	} | ||||||
|  | bool TMC2130Stepper::stop_enable() 					{ GET_BYTE(GCONF, STOP_ENABLE);			} | ||||||
|  | bool TMC2130Stepper::direct_mode() 					{ GET_BYTE(GCONF, DIRECT_MODE);			} | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  | bit 18 not implemented: | ||||||
|  | test_mode 0:  | ||||||
|  | Normal operation 1: | ||||||
|  | Enable analog test output on pin DCO. IHOLD[1..0] selects the function of DCO:  | ||||||
|  | 0…2: T120, DAC, VDDH Attention: | ||||||
|  | Not for user, set to 0 for normal operation!  | ||||||
|  | */ | ||||||
| @ -0,0 +1,16 @@ | |||||||
|  | #include "TMC2130Stepper.h" | ||||||
|  | #include "TMC2130Stepper_MACROS.h" | ||||||
|  | 
 | ||||||
|  | // IHOLD_IRUN
 | ||||||
|  | void TMC2130Stepper::IHOLD_IRUN(uint32_t input) { | ||||||
|  | 	IHOLD_IRUN_sr = input; | ||||||
|  | 	WRITE_REG(IHOLD_IRUN); | ||||||
|  | } | ||||||
|  | uint32_t TMC2130Stepper::IHOLD_IRUN() { return IHOLD_IRUN_sr; } | ||||||
|  | 
 | ||||||
|  | void 	TMC2130Stepper::ihold(uint8_t B) 		{ MOD_REG(IHOLD_IRUN, IHOLD);		} | ||||||
|  | void 	TMC2130Stepper::irun(uint8_t B)  		{ MOD_REG(IHOLD_IRUN, IRUN); 		} | ||||||
|  | void 	TMC2130Stepper::iholddelay(uint8_t B)	{ MOD_REG(IHOLD_IRUN, IHOLDDELAY); 	} | ||||||
|  | uint8_t TMC2130Stepper::ihold() 				{ GET_BYTE(IHOLD_IRUN, IHOLD);		} | ||||||
|  | uint8_t TMC2130Stepper::irun()  				{ GET_BYTE(IHOLD_IRUN, IRUN); 		} | ||||||
|  | uint8_t TMC2130Stepper::iholddelay()  			{ GET_BYTE(IHOLD_IRUN, IHOLDDELAY);	} | ||||||
| @ -0,0 +1,22 @@ | |||||||
|  | #ifndef TMC2130Stepper_MACROS_H | ||||||
|  | #define TMC2130Stepper_MACROS_H | ||||||
|  | #include "TMC2130Stepper.h" | ||||||
|  | #include "../TMC2130Stepper_REGDEFS.h" | ||||||
|  | 
 | ||||||
|  | #define WRITE_REG(R) 	send2130(TMC2130_WRITE|REG_##R, &R##_sr); | ||||||
|  | 
 | ||||||
|  | #define READ_REG(R)   	send2130(TMC2130_READ|REG_##R, &R##_sr); return R##_sr | ||||||
|  | 
 | ||||||
|  | #define READ_REG_R(R)   tmp_sr=0; send2130(TMC2130_READ|REG_##R, &tmp_sr); return tmp_sr; | ||||||
|  | 
 | ||||||
|  | #define MOD_REG(REG, SETTING) 	REG##_sr &= ~SETTING##_bm; \ | ||||||
|  | 								REG##_sr |= ((uint32_t)B<<SETTING##_bp)&SETTING##_bm; \ | ||||||
|  | 								WRITE_REG(REG); | ||||||
|  | 
 | ||||||
|  | #define GET_BYTE(REG, SETTING) 	return (REG()&SETTING##_bm) >> SETTING##_bp; | ||||||
|  | 
 | ||||||
|  | #define GET_BYTE_R(REG, SETTING) return (REG()&SETTING##_bm) >> SETTING##_bp; | ||||||
|  | 
 | ||||||
|  | #define GET_BIT(REG, SETTING) 	return (bool)((REG()&SETTING##_bm) >> SETTING##_bp); | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
| @ -0,0 +1,24 @@ | |||||||
|  | #include "TMC2130Stepper.h" | ||||||
|  | #include "TMC2130Stepper_MACROS.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // PWMCONF
 | ||||||
|  | uint32_t TMC2130Stepper::PWMCONF() { return PWMCONF_sr; } | ||||||
|  | void TMC2130Stepper::PWMCONF(uint32_t input) { | ||||||
|  | 	PWMCONF_sr = input; | ||||||
|  | 	WRITE_REG(PWMCONF); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TMC2130Stepper::pwm_ampl(		uint8_t B )	{ MOD_REG(PWMCONF, PWM_AMPL);		} | ||||||
|  | void TMC2130Stepper::pwm_grad(		uint8_t B )	{ MOD_REG(PWMCONF, PWM_GRAD);		} | ||||||
|  | void TMC2130Stepper::pwm_freq(		uint8_t B )	{ MOD_REG(PWMCONF, PWM_FREQ);		} | ||||||
|  | void TMC2130Stepper::pwm_autoscale(	bool 	B )	{ MOD_REG(PWMCONF, PWM_AUTOSCALE);	} | ||||||
|  | void TMC2130Stepper::pwm_symmetric(	bool 	B )	{ MOD_REG(PWMCONF, PWM_SYMMETRIC);	} | ||||||
|  | void TMC2130Stepper::freewheel(		uint8_t B )	{ MOD_REG(PWMCONF, FREEWHEEL);		} | ||||||
|  | 
 | ||||||
|  | uint8_t TMC2130Stepper::pwm_ampl()		{ GET_BYTE(PWMCONF, PWM_AMPL);		} | ||||||
|  | uint8_t TMC2130Stepper::pwm_grad()		{ GET_BYTE(PWMCONF, PWM_GRAD);		} | ||||||
|  | uint8_t TMC2130Stepper::pwm_freq()		{ GET_BYTE(PWMCONF, PWM_FREQ);		} | ||||||
|  | bool 	TMC2130Stepper::pwm_autoscale()	{ GET_BYTE(PWMCONF, PWM_AUTOSCALE);	} | ||||||
|  | bool 	TMC2130Stepper::pwm_symmetric()	{ GET_BYTE(PWMCONF, PWM_SYMMETRIC);	} | ||||||
|  | uint8_t TMC2130Stepper::freewheel()		{ GET_BYTE(PWMCONF, FREEWHEEL);		} | ||||||
| @ -0,0 +1,209 @@ | |||||||
|  | /**
 | ||||||
|  |  * Marlin 3D Printer Firmware | ||||||
|  |  * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
 | ||||||
|  |  * | ||||||
|  |  * Based on Sprinter and grbl. | ||||||
|  |  * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Einsy-Rambo pin assignments | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef __AVR_ATmega2560__ | ||||||
|  |   #error "Oops!  Make sure you have 'Arduino Mega 2560 or Rambo' selected from the 'Tools -> Boards' menu." | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #define BOARD_NAME          "Einsy Rambo" | ||||||
|  | #define LARGE_FLASH         true | ||||||
|  | 
 | ||||||
|  | // Enable use of TMC2130
 | ||||||
|  | #define HAVE_TMC2130 | ||||||
|  | #define X_IS_TMC2130 | ||||||
|  | #define Y_IS_TMC2130 | ||||||
|  | #define Z_IS_TMC2130 | ||||||
|  | #define E0_IS_TMC2130 | ||||||
|  | 
 | ||||||
|  | #if defined(LULZBOT_USE_EARLY_EINSY) | ||||||
|  |   #define BOARD_X_DIAG_PIN    40 // PG1 as defined in "fastio_1280.h"
 | ||||||
|  |   #define BOARD_Y_DIAG_PIN    69 // PK7 as defined in "fastio_1280.h"
 | ||||||
|  |   #define BOARD_Z_DIAG_PIN    68 // PK6 as defined in "fastio_1280.h"
 | ||||||
|  |   #define BOARD_E0_DIAG_PIN   65 // PK3 as defined in "fastio_1280.h"
 | ||||||
|  | #else | ||||||
|  |   #define BOARD_Z_THRES_PIN   57 // PF3 as defined in "fastio_1280.h"
 | ||||||
|  |   #define BOARD_X_DIAG_PIN    64 // PK2 as defined in "fastio_1280.h"
 | ||||||
|  |   #define BOARD_Y_DIAG_PIN    69 // PK7 as defined in "fastio_1280.h"
 | ||||||
|  |   #define BOARD_Z_DIAG_PIN    68 // PK6 as defined in "fastio_1280.h"
 | ||||||
|  |   #define BOARD_E0_DIAG_PIN   65 // PK3 as defined in "fastio_1280.h"
 | ||||||
|  | #endif | ||||||
|  | #define BOARD_X_MIN_PIN     12 | ||||||
|  | #define BOARD_Y_MIN_PIN     11 | ||||||
|  | #define BOARD_Z_MIN_PIN     10 | ||||||
|  | #if defined(LULZBOT_USE_EARLY_EINSY) | ||||||
|  |   // EINY 0-.1 - EINSY 0.3
 | ||||||
|  |   #define BOARD_X_MAX_PIN     30 | ||||||
|  |   #define BOARD_Y_MAX_PIN     24 | ||||||
|  |   #define BOARD_Z_MAX_PIN     23 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | // Limit Switches
 | ||||||
|  | //
 | ||||||
|  | // EINY 0-.1 - EINSY 0.3 have MAX switches
 | ||||||
|  | #if   defined(LULZBOT_USE_EARLY_EINSY) && defined(LULZBOT_SENSORLESS_HOMING) | ||||||
|  |   #define X_MIN_PIN          BOARD_X_DIAG_PIN | ||||||
|  |   #define Y_MIN_PIN          BOARD_Y_MIN_PIN | ||||||
|  |   #define Z_MIN_PIN          BOARD_Z_MIN_PIN | ||||||
|  |   #define X_MAX_PIN          BOARD_X_MAX_PIN | ||||||
|  |   #define Y_MAX_PIN          BOARD_Y_DIAG_PIN | ||||||
|  |   #define Z_MAX_PIN          BOARD_Z_MAX_PIN | ||||||
|  | 
 | ||||||
|  | #elif defined(LULZBOT_USE_EARLY_EINSY) | ||||||
|  |   #define X_MIN_PIN          BOARD_X_MIN_PIN | ||||||
|  |   #define Y_MIN_PIN          BOARD_Y_MIN_PIN | ||||||
|  |   #define Z_MIN_PIN          BOARD_Z_MIN_PIN | ||||||
|  |   #define X_MAX_PIN          BOARD_X_MAX_PIN | ||||||
|  |   #define Y_MAX_PIN          BOARD_Y_MAX_PIN | ||||||
|  |   #define Z_MAX_PIN          BOARD_Z_MAX_PIN | ||||||
|  | 
 | ||||||
|  | // Einsy 0.4+ lacks MAX switches
 | ||||||
|  | #elif defined(LULZBOT_SENSORLESS_HOMING) | ||||||
|  |   #define X_MIN_PIN          BOARD_X_DIAG_PIN | ||||||
|  |   #define Y_MIN_PIN          -1 | ||||||
|  |   #define Z_MIN_PIN          BOARD_Y_MIN_PIN | ||||||
|  |   #define X_MAX_PIN          -1 | ||||||
|  |   #define Y_MAX_PIN          BOARD_Y_DIAG_PIN | ||||||
|  |   #define Z_MAX_PIN          BOARD_X_MIN_PIN | ||||||
|  | 
 | ||||||
|  | #else | ||||||
|  |   #define X_MIN_PIN          BOARD_X_MIN_PIN | ||||||
|  |   #define Y_MIN_PIN          BOARD_Y_MIN_PIN | ||||||
|  |   #define Z_MIN_PIN          BOARD_Z_MIN_PIN | ||||||
|  |   #define X_MAX_PIN          -1 // 30
 | ||||||
|  |   #define Y_MAX_PIN          -1 // 24
 | ||||||
|  |   #define Z_MAX_PIN          BOARD_Z_THRES_PIN | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | // Steppers
 | ||||||
|  | //
 | ||||||
|  | #define X_STEP_PIN         37 | ||||||
|  | #define X_DIR_PIN          49 | ||||||
|  | #define X_ENABLE_PIN       29 | ||||||
|  | 
 | ||||||
|  | #define Y_STEP_PIN         36 | ||||||
|  | #define Y_DIR_PIN          48 | ||||||
|  | #define Y_ENABLE_PIN       28 | ||||||
|  | 
 | ||||||
|  | #define Z_STEP_PIN         35 | ||||||
|  | #define Z_DIR_PIN          47 | ||||||
|  | #define Z_ENABLE_PIN       27 | ||||||
|  | 
 | ||||||
|  | #define E0_STEP_PIN        34 | ||||||
|  | #define E0_DIR_PIN         43 | ||||||
|  | #define E0_ENABLE_PIN      26 | ||||||
|  | 
 | ||||||
|  | #define E1_STEP_PIN        -1 | ||||||
|  | #define E1_DIR_PIN         -1 | ||||||
|  | #define E1_ENABLE_PIN      -1 | ||||||
|  | 
 | ||||||
|  | // Microstepping pins - Mapping not from fastio.h (?)
 | ||||||
|  | #define X_MS1_PIN          -1 | ||||||
|  | #define X_MS2_PIN          -1 | ||||||
|  | #define X_CS_PIN           41 | ||||||
|  | #define Y_MS1_PIN          -1 | ||||||
|  | #define Y_MS2_PIN          -1 | ||||||
|  | #define Y_CS_PIN           39 | ||||||
|  | #define Z_MS1_PIN          -1 | ||||||
|  | #define Z_MS2_PIN          -1 | ||||||
|  | #define Z_CS_PIN           67 | ||||||
|  | #define E0_MS1_PIN         -1 | ||||||
|  | #define E0_MS2_PIN         -1 | ||||||
|  | #define E0_CS_PIN          66 | ||||||
|  | 
 | ||||||
|  | #define MOTOR_CURRENT_PWM_XY_PIN 46 | ||||||
|  | #define MOTOR_CURRENT_PWM_Z_PIN  45 | ||||||
|  | #define MOTOR_CURRENT_PWM_E_PIN  44 | ||||||
|  | // Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range
 | ||||||
|  | #ifndef MOTOR_CURRENT_PWM_RANGE | ||||||
|  |   #define MOTOR_CURRENT_PWM_RANGE 2000 | ||||||
|  | #endif | ||||||
|  | #define DEFAULT_PWM_MOTOR_CURRENT  {1300, 1300, 1300} | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | // Temperature Sensors
 | ||||||
|  | //
 | ||||||
|  | #define TEMP_0_PIN          0   // Analog Input
 | ||||||
|  | #define TEMP_1_PIN          1   // Analog Input
 | ||||||
|  | #define TEMP_BED_PIN        2   // Analog Input
 | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | // Heaters / Fans
 | ||||||
|  | //
 | ||||||
|  | #define HEATER_0_PIN        3 | ||||||
|  | #define HEATER_1_PIN        7 | ||||||
|  | #define HEATER_2_PIN        6 | ||||||
|  | #define HEATER_BED_PIN      4 | ||||||
|  | 
 | ||||||
|  | #define FAN_PIN             8 | ||||||
|  | #define FAN1_PIN            6 | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | // Misc. Functions
 | ||||||
|  | //
 | ||||||
|  | #if defined(LULZBOT_USE_EARLY_EINSY) | ||||||
|  |   #define SDSS             53 // EINY 0-.1 - EINSY 0.3
 | ||||||
|  | #else | ||||||
|  |   #define SDSS             77 // EINSY 0.4
 | ||||||
|  | #endif | ||||||
|  | #define LED_PIN            13 | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | // LCD / Controller
 | ||||||
|  | //
 | ||||||
|  | #if ENABLED(ULTRA_LCD) | ||||||
|  | 
 | ||||||
|  |   #define KILL_PIN         32 | ||||||
|  | 
 | ||||||
|  |   #if ENABLED(NEWPANEL) | ||||||
|  | 
 | ||||||
|  |     // Beeper on AUX-4
 | ||||||
|  |     #define BEEPER_PIN     84 | ||||||
|  | 
 | ||||||
|  |     #define LCD_PINS_RS    82 | ||||||
|  |     #if defined(LULZBOT_USE_EARLY_EINSY) | ||||||
|  |       // EINY 0.1- EINSY-0.3
 | ||||||
|  |       #define LCD_PINS_ENABLE 18 | ||||||
|  |       #define LCD_PINS_D4     19 | ||||||
|  |     #else | ||||||
|  |       // EINSY 0.4+
 | ||||||
|  |       #define LCD_PINS_ENABLE 61 | ||||||
|  |       #define LCD_PINS_D4     59 | ||||||
|  |     #endif | ||||||
|  |     #define LCD_PINS_D5    70 | ||||||
|  |     #define LCD_PINS_D6    85 | ||||||
|  |     #define LCD_PINS_D7    71 | ||||||
|  | 
 | ||||||
|  |     // buttons are directly attached using AUX-2
 | ||||||
|  |     #define BTN_EN1        14 | ||||||
|  |     #define BTN_EN2        72 | ||||||
|  |     #define BTN_ENC         9  // the click
 | ||||||
|  | 
 | ||||||
|  |     #define SD_DETECT_PIN  15 | ||||||
|  | 
 | ||||||
|  |   #endif // NEWPANEL
 | ||||||
|  | #endif // ULTRA_LCD
 | ||||||
					Loading…
					
					
				
		Reference in new issue
	
	 Marcio Teixeira
						Marcio Teixeira