Selaa lähdekoodia

update AT32 mcu

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 vuotta sitten
vanhempi
commit
95f6a8c637

+ 64 - 30
Applications/bsp/at32/adc.c

@@ -59,9 +59,7 @@
 #define REG_CHAN_NUM (ADC1_NUM + ADC2_NUM)
 u16 adc_buffer[REG_CHAN_NUM];
 float vref_adc = 1408.0f;
-float vref_5v_adc = 2047.0f;
-
-#define VREF_ADC_DATA 1509.0F //1498, 1.21/3.3*4095
+float vref_5v_adc = 3095.0f;
 
 static void analog_gpio_init(gpio_type *gpiox, u32 pin) {
 	gpio_init_type gpio_init_struct = {0};
@@ -102,18 +100,20 @@ static void adc0_init(void){
 	adc_base_config_type adc_base_struct;
 	
 	/* adc clock configuration */
-	crm_adc_clock_div_set(CRM_ADC_DIV_4);								  /* PCLK2 Max. CLK = 100M Hz, ADC_CLK = 100/4 = 25M Hz */
+	crm_adc_clock_div_set(CRM_ADC_DIV_8);								  /* PCLK2 Max. CLK = 100M Hz, ADC_CLK = 100/4 = 25M Hz */
 	crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
-	adc_reset(ADC1);
-	/* select adc mster-slave mode */
-	adc_combine_mode_select(ADC_ORDINARY_SMLT_PREEMPT_SMLT_MODE);
+	crm_periph_clock_enable(CRM_ADC2_PERIPH_CLOCK, TRUE);
 
+	adc_reset(ADC1);
+	adc_reset(ADC2);
+	
 	adc_base_struct.sequence_mode = TRUE;
 	adc_base_struct.repeat_mode = TRUE;
 	adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
 	adc_base_struct.ordinary_channel_length = ADC1_NUM;
 	adc_base_config(ADC1, &adc_base_struct);
-
+	adc_base_config(ADC2, &adc_base_struct);
+	
 	/* ordinary channel configuration */
 	adc_ordinary_channel_set(ADC1, MOS_TEMP_ADC_CHAN, 1, ADC_REGCHAN_SAMPLE_TIME);
 	adc_ordinary_channel_set(ADC1, MOTOR_TEMP_ADC_CHAN, 2, ADC_REGCHAN_SAMPLE_TIME);
@@ -124,33 +124,69 @@ static void adc0_init(void){
 	adc_ordinary_channel_set(ADC1, THROTTLE2_5V_CHAN, 7, ADC_REGCHAN_SAMPLE_TIME);
 	adc_ordinary_channel_set(ADC1, U_VOL_ADC_CHAN, 8, ADC_REGCHAN_SAMPLE_TIME);
 	adc_ordinary_channel_set(ADC1, ZERO_ADC_CHAN, 9, ADC_REGCHAN_SAMPLE_TIME); //insert zero vol
-
 	adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
 
-	adc_preempt_channel_length_set(ADC1, 1);
+	adc_ordinary_channel_set(ADC2, VBUS_V_CHAN, 1, ADC_REGCHAN_SAMPLE_TIME);
+	adc_ordinary_channel_set(ADC2, ACC_V_CHAN, 2, ADC_REGCHAN_SAMPLE_TIME);
+	adc_ordinary_channel_set(ADC2, VBUS_I_CHAN, 3, ADC_REGCHAN_SAMPLE_TIME);
+	adc_ordinary_channel_set(ADC2, V_VOL_ADC_CHAN, 4, ADC_REGCHAN_SAMPLE_TIME);
+	adc_ordinary_channel_set(ADC2, W_VOL_ADC_CHAN, 5, ADC_REGCHAN_SAMPLE_TIME);
+	adc_ordinary_channel_set(ADC2, ZERO_ADC_CHAN, 6, ADC_REGCHAN_SAMPLE_TIME); //insert zero vol
+	adc_ordinary_channel_set(ADC2, THROTTLE_5V_CHAN, 7, ADC_REGCHAN_SAMPLE_TIME);
+	adc_ordinary_channel_set(ADC2, ZERO_ADC_CHAN, 8, ADC_REGCHAN_SAMPLE_TIME); //insert zero vol
+	adc_ordinary_channel_set(ADC2, DC5V_ADC_CHAN, 9, ADC_REGCHAN_SAMPLE_TIME);
+	adc_ordinary_conversion_trigger_set(ADC2, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
+
+
+	adc_preempt_channel_length_set(ADC1, 3);
 	adc_preempt_channel_set(ADC1, V_PHASE_I_CHAN, 1, ADC_SAMPLE_TIME);
+	adc_preempt_channel_set(ADC1, V_PHASE_I_CHAN, 2, ADC_SAMPLE_TIME);
+	adc_preempt_channel_set(ADC1, V_PHASE_I_CHAN, 3, ADC_SAMPLE_TIME);
+	//adc_preempt_channel_set(ADC1, V_PHASE_I_CHAN, 4, ADC_SAMPLE_TIME);
 	/* adc prempt trigger source */
 	adc_preempt_conversion_trigger_set(ADC1, ADC12_PREEMPT_TRIG_TMR1CH4, TRUE);
 
+	adc_preempt_channel_length_set(ADC2, 3);
+	adc_preempt_channel_set(ADC2, W_PHASE_I_CHAN, 1, ADC_SAMPLE_TIME);
+	adc_preempt_channel_set(ADC2, W_PHASE_I_CHAN, 2, ADC_SAMPLE_TIME);
+	adc_preempt_channel_set(ADC2, W_PHASE_I_CHAN, 3, ADC_SAMPLE_TIME);
+	//adc_preempt_channel_set(ADC2, W_PHASE_I_CHAN, 4, ADC_SAMPLE_TIME);
+	/* adc prempt trigger source */
+	adc_preempt_conversion_trigger_set(ADC2, ADC12_PREEMPT_TRIG_TMR1CH4, TRUE);
+
+	/* select adc mster-slave mode */
+	adc_combine_mode_select(ADC_ORDINARY_SMLT_PREEMPT_SMLT_MODE);
+
 	adc_tempersensor_vintrv_enable(TRUE);
 
 	adc_dma_mode_enable(ADC1, TRUE);
+	adc_dma_mode_enable(ADC2, TRUE);
+
 	/* ADC enable and calibration */
-	if(ADC1->ctrl2_bit.adcen != TRUE)
-	{
-	  adc_enable(ADC1, TRUE);
-	  adc_calibration_init(ADC1);
-	  while(adc_calibration_init_status_get(ADC1));
-	  adc_calibration_start(ADC1);
-	  while(adc_calibration_status_get(ADC1));
-	}
+	adc_enable(ADC1, TRUE);
+	adc_calibration_init(ADC1);
+	while(adc_calibration_init_status_get(ADC1));
+	adc_calibration_start(ADC1);
+	while(adc_calibration_status_get(ADC1));
+
+	adc_enable(ADC2, TRUE);
+	adc_calibration_init(ADC2);
+	while(adc_calibration_init_status_get(ADC2));
+	adc_calibration_start(ADC2);
+	while(adc_calibration_status_get(ADC2));
+
 	nvic_irq_enable(ADC1_2_IRQn, ADC_IRQ_PRIORITY, 0);
 
 	adc_disable_ext_trigger();
+
+	adc_current_sample_config(0);
+	
+	adc_ordinary_software_trigger_enable(ADC1, TRUE);
 }
 
 static void adc1_init(void){
 
+#if 0
 	adc_base_config_type adc_base_struct;
 	
 	/* adc clock configuration */
@@ -173,24 +209,24 @@ static void adc1_init(void){
 	adc_ordinary_channel_set(ADC2, THROTTLE_5V_CHAN, 7, ADC_REGCHAN_SAMPLE_TIME);
 	adc_ordinary_channel_set(ADC2, ZERO_ADC_CHAN, 8, ADC_REGCHAN_SAMPLE_TIME); //insert zero vol
 	adc_ordinary_channel_set(ADC2, DC5V_ADC_CHAN, 9, ADC_REGCHAN_SAMPLE_TIME);
-
 	adc_ordinary_conversion_trigger_set(ADC2, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
 
-	adc_preempt_channel_length_set(ADC2, 1);
+	adc_preempt_channel_length_set(ADC2, 3);
 	adc_preempt_channel_set(ADC2, W_PHASE_I_CHAN, 1, ADC_SAMPLE_TIME);
+	adc_preempt_channel_set(ADC2, W_PHASE_I_CHAN, 2, ADC_SAMPLE_TIME);
+	adc_preempt_channel_set(ADC2, W_PHASE_I_CHAN, 3, ADC_SAMPLE_TIME);
+	//adc_preempt_channel_set(ADC2, W_PHASE_I_CHAN, 4, ADC_SAMPLE_TIME);
 	/* adc prempt trigger source */
 	adc_preempt_conversion_trigger_set(ADC2, ADC12_PREEMPT_TRIG_TMR1CH4, TRUE);
 
 	adc_dma_mode_enable(ADC2, TRUE);
 	/* ADC enable and calibration */
-	if(ADC2->ctrl2_bit.adcen != TRUE)
-	{
-	  adc_enable(ADC2, TRUE);
-	  adc_calibration_init(ADC2);
-	  while(adc_calibration_init_status_get(ADC2));
-	  adc_calibration_start(ADC2);
-	  while(adc_calibration_status_get(ADC2));
-	}
+	adc_enable(ADC2, TRUE);
+	adc_calibration_init(ADC2);
+	while(adc_calibration_init_status_get(ADC2));
+	adc_calibration_start(ADC2);
+	while(adc_calibration_status_get(ADC2));
+#endif
 }
 
 
@@ -288,8 +324,6 @@ void adc_init(void) {
 	adc01_dma_init();
 	adc0_init();
 	adc1_init();
-	adc_current_sample_config(0);
-	adc_ordinary_software_trigger_enable(ADC1, TRUE);
 }
 
 void adc_set_vref_calc(float v) {

+ 4 - 4
Applications/bsp/at32/adc.h

@@ -26,14 +26,14 @@ inserted ADC 由timer0 ch3触发,
 
 
 static void __inline adc_phase_current_read(u8 phases, s32 *v1, s32 *v2) {
-	*v1 = (s32)((float)ADC1->pdt1_bit.pdt1 * adc_5vref_compesion());
-	*v2 = (s32)((float)ADC2->pdt1_bit.pdt1 * adc_5vref_compesion());
+	*v1 = (s32)((float)((ADC1->pdt2_bit.pdt2 + ADC1->pdt3_bit.pdt3)/2.0f) * adc_5vref_compesion());
+	*v2 = (s32)((float)((ADC2->pdt2_bit.pdt2 + ADC2->pdt3_bit.pdt3)/2.0f) * adc_5vref_compesion());
 }
 
 
 static void __inline adc_current_sample_config(u8 phases) {
-	ADC1->psq_bit.psn4 = V_PHASE_I_CHAN;
-	ADC2->psq_bit.psn4 = W_PHASE_I_CHAN;
+	//ADC1->psq_bit.psn4 = V_PHASE_I_CHAN;
+	//ADC2->psq_bit.psn4 = W_PHASE_I_CHAN;
 }
 
 static void __inline adc_disable_ext_trigger(void) {   

+ 1 - 1
Applications/bsp/at32/pwm.c

@@ -38,7 +38,7 @@ static void pwm_gpio_init(gpio_type *gpiox, gpio_mode_type mode, gpio_output_typ
 
 void pwm_3phase_init(void){
 	_pwm_gpio_config();
-    _init_pwm_timer(true);
+    _init_pwm_timer(false);
 }
 
 void pwm_3phase_sides(bool hon, bool lon) {

+ 1 - 1
Project/MC105AT_V3.uvoptx

@@ -193,7 +193,7 @@
         <Ww>
           <count>7</count>
           <WinNumber>1</WinNumber>
-          <ItemText>adc_buffer[11]</ItemText>
+          <ItemText>adc_buffer[17],0x0A</ItemText>
         </Ww>
       </WatchWindow1>
       <MemoryWindow1>